TCP 通讯服务端平台/库 tcpdaemon 更新至 v1.2.2

1.2.2 2017-06-06 calvin

  • 封装更多的IO多路复用代码进tcpdaemon,使用者用tcpmain返回值设置等待事件
  • IO多路复用模型新增超时机制


1.概述
tcpdaemon是一个TCP通讯服务端平台/库,它封装了众多常见服务端进程/线程管理和TCP连接管理模型(Forking、Leader-Follow、IO-Multiplex、WindowsThreads Leader-Follow),使用者只需加入TCP通讯数据收发和应用逻辑代码就能快速构建出完整的TCP应用服务器。

...

2.使用示例
2.1.服务模型Forking,链接模式1,接收HTTP请求报文然后发送HTTP响应报文

使用者只需编写一个函数tcpmain,实现同步的接收HTTP请求报文然后发送HTTP响应报文回去

$ vi test_callback_http_echo.c
#include "tcpdaemon.h"

_WINDLL_FUNC int tcpmain( struct TcpdaemonServerEnvirment *p_env , int sock , void *p_addr )
{
    char    http_buffer[ 4096 + 1 ] ;
    long    http_len ;
    long    len ;

    /* 接收HTTP请求 */
    memset( http_buffer , 0x00 , sizeof(http_buffer) );
    http_len = 0 ;
    while( sizeof(http_buffer)-1 - http_len > 0 )
    {
        len = RECV( sock , http_buffer + http_len , sizeof(http_buffer)-1 - http_len , 0 ) ;
        if( len == 0 )
            return TCPMAIN_RETURN_CLOSE;
        if( len == -1 )
            return TCPMAIN_RETURN_ERROR;
        if( strstr( http_buffer , "\r\n\r\n" ) )
            break;
        http_len += len ;
    }
    if( sizeof(http_buffer)-1 - http_len <= 0 )
    {
        return TCPMAIN_RETURN_ERROR;
    }

    /* 发送HTTP响应 */
    memset( http_buffer , 0x00 , sizeof(http_buffer) );
    http_len = 0 ;
    http_len = sprintf( http_buffer , "HTTP/1.0 200 OK\r\nContent-length: 17\r\n\r\nHello Tcpdaemon\r\n" ) ;
    SEND( sock , http_buffer , http_len , 0 );

    return TCPMAIN_RETURN_CLOSE;
}

编译链接成test_callback_http_echo.so

$ gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/home/calvin/include/tcpdaemon  -c test_callback_http_echo.c
$ gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -shared -o test_callback_http_echo.so test_callback_http_echo.o -L. -L/home/calvin/lib -lpthread -ldl

用tcpdaemon直接挂接即可

$ tcpdaemon -m IF -l 0:9527 -s test_callback_http_echo.so -c 10 --tcp-nodelay --logfile $HOME/log/test_callback_http_echo.log --loglevel-debug
可```
执行程序tcpdaemon所有命令行参数可以不带参数的执行而得到

$ tcpdaemon
USAGE : tcpdaemon -m IF -l ip:port -s so_pathfilename [ -c max_process_count ]

              -m LF -l ip:port -s so_pathfilename -c process_count [ -n max_requests_per_process ]
    other options :
              -v
              [ --daemon-level ]
              [ --work-path work_path ]
              [ --work-user work_user ]
执行后可在$HOME/log下可以看到tcpdaemon的日志。

通过curl发测试请求

$ curl "http://localhost:9527/"
Hello Tcpdaemon

测试成功!

所有代码在源码安装包的test目录里下可以找到

...

时间: 2024-09-28 04:05:04

TCP 通讯服务端平台/库 tcpdaemon 更新至 v1.2.2的相关文章

tcpdaemon 更新至 v1.2.1 , TCP 通讯服务端平台/库

1.2.1 2017-06-04 calvin * 修正了服务模型IOMP的多进程没有轮流切换主侦听问题 1.2.0 2017-06-03 calvin * 重整了代码,有少许接口与老版本不兼容 * 新增服务模型IOMP,支持Linux环境 0.快速开始 老师交给小明一个开发任务,实现一个TCP网络迭代并发服务器,用于回射任何接收到的通讯数据.小明很懒,他在开源中国项目库里搜到了开源库tcpdaemon来帮助他快速完成任务.首先他安装好tcpdaemon,然后写了一个C程序文件 test_cal

安卓手机(客户端)与PC(服务端)进行TCP通讯 可是ipv4地址老变 怎么办

问题描述 安卓手机(客户端)与PC(服务端)进行TCP通讯 可是ipv4地址老变 怎么办 换台电脑测试结果又不行了 ipv4不对 有没有让服务端自己设置一个固定IP 然后让客户端来连接 这样在哪台PC上都OK了 解决方案 服务器的IP地址你设置成固定的,或者用公网合法IP,绑定域名等.防止变化 解决方案二: 国内没有固定ip,需要映射域名,可以使用花生壳之内的软件

在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分

编程|网络|异步 ///////////////////////////////////////////////////////////////////////////////////////////* 标题:在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分 当看到.NET中TcpListener和TcpClient的时候,我非常高兴,那就是我想要的通讯模式但是使用之后发现它们的力量太单薄了,我们需要一个更好的类库来替代它们. 下面提供了一些类,可以

tcp 广域网-关于不同局域网TCP通讯的问题

问题描述 关于不同局域网TCP通讯的问题 两台PC,A和B,分别处于不同的局域网中,均通过路由器上网,假设A作为服务端,B作为客户端 要如何设置端口映射?网上搜了一下,大多数意见表示, 1.PC A 只能是公网,也就是直接使用ADSL拨号上网,再映射端口,PC B 才能连接到A 2.PC A 申请运营商的静态IP,PC B则可直接连接到A,不需要端口映射 但是如果A和B都是在局域网中,要如何实现,仅仅是在A的路由器上映射端口,B是不是无法发起连接和正常通讯? 解决方案 必须需要一台公网服务器,否

boost asio 异步实现tcp通讯

---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的.而tcp通讯是项目当中经常用到通讯方式之一,实现的方法有各式各样,因此总结一套适用于自己项目的方法是很有必要,很可能下一个项目直接套上去就可以用了.   二.实现思路

在局域网内部实现MSN通讯服务

MSN Messenger Service集即时消息.网络电话.自动检查邮件等功能于一体,很受广大"网虫"的喜爱,但是您知道吗,MSN Messenger Service不但可以登录到MSN的Messenger Server,还可以登录到局域网内的Exchange Server呢!无需连接到Internet,您一样可以享受MSN Messenger Service的强大功能! 下面笔者就如何建立局域网内部的通讯服务做详细介绍: 前提条件 网络中有一台计算机安装了Microsoft Ex

事件日志中的"TermService" 服务的性能库

  发现事件记录: "TermService" 服务的性能库 "C:WINDOWSsystem32perfts.dll" 的配置信息  同在注册表中保存的受信任性能库信息不匹配.此库中的函数不会作为受信任函数处理. TermService是系统的一个服务. Terminal Services 提供一个多会话环境,客户端设备可以在此环境中访问虚拟 Windows 桌面会话和服务器上运行的基于 Windows 的程序.Terminal Services 使用户可以远程管

JAVA通信编程(三)——TCP通讯

继上一篇小插曲之后继续回到正题,本篇讲述的是java的TCP通讯.TCP编程分为server端和client端,一般在网上都能搜到相关的例子,为了方便大家,我这里先整理下server端和client端的应用案例,然后再根据在本系列中第一篇串口通讯中的结构一样实现CommBuff接口. java tcp socket编程server端: import java.io.*; import java.net.*; import java.applet.Applet; public class Talk

QIP.ru即时通讯服务3300万明文密码被泄

QIP.ru是一家主要在俄罗斯本土运营的即时通讯服务提供商,但最近曝出了其3300万用户明文密码被黑客盗取的大事件.外媒SoftPedia从网络安全初创企业HEROIC得到了一份样本数据,后者的主要业务是保护用户远离黑客攻击和网络威胁.该公司称,数据来自某个化名为Jabber ID(daykalif@xmpp.jp)的黑客,此前他还泄露过Last.fm和Rambler.ru的数据. 为了验证泄露数据的可靠性,SoftPedia和HEROIC都尝试了注册样本中相同名称/电子邮件地址的账户,然后成功