libevent 如何创建TCP客户端
时间: 2024-06-11 22:06:41 浏览: 166
aerospike-async-client:Aerospike Libevent2异步客户端
要创建TCP客户端,需要使用libevent提供的evconnlistener和bufferevent API。以下是一个简单的例子:
```
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void read_cb(struct bufferevent *bev, void *ctx)
{
struct evbuffer *input = bufferevent_get_input(bev);
char buf[1024];
int len = evbuffer_remove(input, buf, sizeof(buf)-1);
buf[len] = '\0';
printf("Received: %s\n", buf);
}
void event_cb(struct bufferevent *bev, short events, void *ctx)
{
if (events & BEV_EVENT_CONNECTED)
{
printf("Connected to server.\n");
bufferevent_write(bev, "Hello, server!\n", 15);
}
else if (events & (BEV_EVENT_ERROR|BEV_EVENT_EOF))
{
printf("Connection closed.\n");
bufferevent_free(bev);
}
}
int main(int argc, char **argv)
{
struct event_base *base;
struct sockaddr_in sin;
struct bufferevent *bev;
int fd;
base = event_base_new();
fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_port = htons(8080);
bufferevent_socket_connect(bev, (struct sockaddr *)&sin, sizeof(sin));
bufferevent_setcb(bev, read_cb, NULL, event_cb, NULL);
bufferevent_enable(bev, EV_READ|EV_WRITE);
event_base_dispatch(base);
return 0;
}
```
在这个例子中,我们首先创建了一个event_base对象。然后创建一个socket并设置地址和端口。接下来,我们调用bufferevent_socket_connect函数来连接服务器。一旦连接建立,event_cb回调函数将被调用,并发送一条消息给服务器。我们还设置了一个read_cb回调函数来接收从服务器发送的数据。最后,我们启用bufferevent以监听读写事件并调用event_base_dispatch来开始事件循环。
需要注意的是,这个例子中没有处理错误情况,实际应用中需要根据具体情况进行处理。
阅读全文