libevent 创建tcp客户端
时间: 2023-08-23 18:05:50 浏览: 149
libevent是一个事件驱动的网络库,可以用来创建高效的网络应用程序。下面是使用libevent库创建TCP客户端的步骤:
1. 引入libevent库头文件:
```
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/util.h>
```
2. 创建event_base对象:
```
struct event_base* base = event_base_new();
```
3. 创建连接:
```
struct bufferevent* bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, readcb, NULL, eventcb, NULL);
bufferevent_enable(bev, EV_READ|EV_WRITE);
bufferevent_socket_connect(bev, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
```
其中,readcb是读取数据回调函数,eventcb是事件回调函数,serveraddr是服务器地址。
4. 发送数据:
```
const char* data = "hello, world!";
bufferevent_write(bev, data, strlen(data));
```
5. 接收数据:
```
void readcb(struct bufferevent* bev, void* ctx)
{
struct evbuffer* input = bufferevent_get_input(bev);
size_t len = evbuffer_get_length(input);
char* data = malloc(len+1);
evbuffer_remove(input, data, len);
data[len] = '\0';
printf("received data: %s\n", data);
free(data);
}
```
6. 事件循环:
```
event_base_dispatch(base);
```
完整代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/util.h>
void readcb(struct bufferevent* bev, void* ctx)
{
struct evbuffer* input = bufferevent_get_input(bev);
size_t len = evbuffer_get_length(input);
char* data = malloc(len+1);
evbuffer_remove(input, data, len);
data[len] = '\0';
printf("received data: %s\n", data);
free(data);
}
void eventcb(struct bufferevent* bev, short events, void* ctx)
{
if (events & BEV_EVENT_CONNECTED) {
printf("connected\n");
} else if (events & BEV_EVENT_ERROR) {
printf("error\n");
}
}
int main(int argc, char** argv)
{
struct event_base* base = event_base_new();
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(12345);
inet_pton(AF_INET, "127.0.0.1", &serveraddr.sin_addr);
struct bufferevent* bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, readcb, NULL, eventcb, NULL);
bufferevent_enable(bev, EV_READ|EV_WRITE);
bufferevent_socket_connect(bev, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
const char* data = "hello, world!";
bufferevent_write(bev, data, strlen(data));
event_base_dispatch(base);
bufferevent_free(bev);
event_base_free(base);
return 0;
}
```
阅读全文
相关推荐


















