在libevent 上封装一个简单网络库,方便构建 TCP/UDP/UNIX 服务端,和客户端。
- 支持长连接和短连接。
- 服务端可以支持每妙处理请求,5W/qps, 每核。
- 信息接收采用预分配加动态调整,性能和内存取得很好的平衡。
- 支持定时回调上层逻辑
接口例子:
int ts_accept_fun(int sfd, int cfd, struct sockaddr *addr, int addrLen)
{
fprintf(stderr, "[srv] accept srv_fd: %d, cli_fd: %d, addrLen: %d\n", sfd, cfd, addrLen);
return 0;
}
// pkg 是个完整的应用层协议包,headCmd 是客户端用来标示pkg解包协议
int ts_pkg_fun(int sock, struct sockaddr *addr, unsigned int addrLen, const char *pkg, unsigned int pkgLen, unsigned int headCmd)
{
fprintf(stderr, "[srv] sock: %d, pkg: %s, pkg_len: %d, head_cmd: %d\n", sock, pkg, pkgLen, headCmd);
return 0;
}
int ts_close_fun(int sock)
{
fprintf(stderr, "[srv] cli sock: %d close\n", sock);
return 0;
}
int ts_timer_fun()
{
fprintf(stderr, "[srv] timer exec, time: %d\n", time(NULL));
return 0;
}
void test_tcp_srv()
{
const char *ip = "127.0.0.1";
unsigned int port = 1235;
ev_srv_init(&evSrv);
int iRet = ev_srv_bind_ip(&evSrv, ip, port, ts_accept_fun, ts_pkg_fun, ts_close_fun, 0, -1, 5);
YG_ASSERT_RET(iRet > 0, );
iRet = ev_srv_add_timer(&evSrv, ts_timer_fun, 1000 * 3);
YG_ASSERT_RET(iRet >= 0, );
ev_srv_run(&evSrv);
}
测试:
- 编译测试 cd test; make;
- 启动测试服务端 ./test_ev tcp_srv;
- 启动测试客户端 ./test_ev tcp_cli;