libevent tcp客户端收发数据demo
时间: 2024-02-02 12:38:36 浏览: 167
下面是一个简单的libevent TCP客户端收发数据的示例代码:
```c
#include <event2/event.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h>
#include <iostream>
#include <string.h>
using namespace std;
void read_cb(bufferevent* bev, void* arg)
{
char buf[1024];
size_t len = bufferevent_read(bev, buf, sizeof(buf));
buf[len] = '\0';
cout << "Received message: " << buf << endl;
}
void write_cb(bufferevent* bev, void* arg)
{
cout << "Message sent!" << endl;
}
void event_cb(bufferevent* bev, short events, void* arg)
{
if (events & BEV_EVENT_CONNECTED) {
cout << "Connected to server!" << endl;
bufferevent_write(bev, "Hello, server!\n", strlen("Hello, server!\n"));
} else if (events & BEV_EVENT_ERROR) {
cout << "Error: " << evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()) << endl;
event_base_loopbreak(bufferevent_get_base(bev));
}
}
int main(int argc, char** argv)
{
struct event_base* base = event_base_new();
struct bufferevent* bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, read_cb, write_cb, event_cb, NULL);
bufferevent_enable(bev, EV_READ|EV_WRITE);
bufferevent_socket_connect_hostname(bev, NULL, AF_UNSPEC, "localhost", 12345);
event_base_dispatch(base);
bufferevent_free(bev);
event_base_free(base);
return 0;
}
```
在这个示例中,我们创建了一个libevent的事件循环`base`和一个TCP客户端`bev`。我们通过`bufferevent_socket_new()`函数创建了一个`bufferevent`对象,它封装了一个TCP连接。我们使用`bufferevent_setcb()`函数设置了当`bev`有读、写和事件发生时的回调函数。然后使用`bufferevent_enable()`函数启用读、写事件。接着使用`bufferevent_socket_connect_hostname()`函数连接到服务器。
当连接成功建立时,会触发`event_cb()`函数中的`BEV_EVENT_CONNECTED`事件,我们可以在这里发送一条消息给服务器,例如"Hello, server!\n"。当服务器回复消息时,会触发`read_cb()`函数,我们可以在这里读取服务器发送的消息。当发生错误时,会触发`event_cb()`函数中的`BEV_EVENT_ERROR`事件,我们可以在这里输出错误信息并停止事件循环。
需要注意的是,我们在程序结束时需要手动释放`bev`和`base`对象。
阅读全文