发布于 2017-06-06 23:51:21 | 159 次阅读 | 评论: 0 | 来源: 网友投递
tcpdaemon TCP连接管理
tcpdaemon是类似于xinetd的TCP守护服务,它封装提供了各种常见TCP连接管理模型(即时派生、预派生进程池等),使用者只需编写TCP通讯数据交换协议和应用处理代码,就能快速完整构造自己的TCP应用服务器。
1.2.2 2017-06-06 calvin
* 封装更多的IO多路复用代码进tcpdaemon,使用者用tcpmain返回值设置等待事件
* IO多路复用模型新增超时机制
----------------------------------------------------
tcpdaemon是一个TCP通讯服务端平台/库,它封装了众多常见服务端进程/线程管理和TCP连接管理模型(Forking、Leader-Follow、IO-Multiplex、WindowsThreads Leader-Follow),使用者只需加入TCP通讯数据收发和应用逻辑代码就能快速构建出完整的TCP应用服务器。
...
使用者只需编写一个函数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 , "rnrn" ) ) 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 OKrnContent-length: 17rnrnHello Tcpdaemonrn" ) ; 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目录里下可以找到
...
源码托管地址 : http://git.oschina.net/calvinwilliams/tcpdaemon