libeventxx 如何创建一个TCP程序
时间: 2024-05-06 16:19:32 浏览: 53
libevent写的客户端+服务端TCP通信程序源码,具有分包功能
以下是使用libeventxx创建一个简单的TCP程序的步骤:
1. 导入libeventxx库
在程序中导入libeventxx库,可以使用CMake或手动链接库的方式。
2. 创建一个event_base对象
使用event_base_new()函数创建一个event_base对象。这个对象将被用于管理事件处理器和事件。
3. 创建一个socket
使用socket()函数创建一个TCP socket。这个socket将被用于监听客户端连接。
4. 绑定socket到地址和端口
使用bind()函数将socket绑定到地址和端口。这样客户端就可以通过这个地址和端口连接到服务器。
5. 监听socket
使用listen()函数开始监听socket。服务器现在可以接受客户端连接。
6. 创建一个event对象
使用event_new()函数创建一个event对象。这个对象将被用于处理客户端连接事件。
7. 绑定event对象到socket
使用event_assign()函数将event对象绑定到socket上。这个事件对象将处理来自客户端的连接请求。
8. 设置事件回调函数
使用event_set()函数设置事件回调函数。当有客户端连接请求时,此函数将被调用。
9. 开始事件循环
使用event_base_dispatch()函数启动事件循环。这个函数将一直运行,直到程序结束或者事件处理器被手动停止。
完整的代码示例:
```c++
#include <event2/event.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
void accept_cb(evconnlistener* listener, evutil_socket_t fd, sockaddr* addr, int len, void* ptr)
{
std::cout << "accept connection from " << inet_ntoa(((sockaddr_in*)addr)->sin_addr) << std::endl;
event_base* base = (event_base*)ptr;
bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, NULL, NULL, NULL, NULL);
bufferevent_enable(bev, EV_READ | EV_WRITE);
}
int main()
{
event_base* base = event_base_new();
sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(12345);
evconnlistener* listener = evconnlistener_new_bind(base, accept_cb, base, LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE, -1, (sockaddr*)&sin, sizeof(sin));
event_base_dispatch(base);
evconnlistener_free(listener);
event_base_free(base);
return 0;
}
```
这个程序将监听本地12345端口,并在有客户端连接时输出客户端IP地址。当客户端连接成功后,程序将创建一个bufferevent对象来接收和发送数据。
阅读全文