我一直在努力思考如何设置它。我在网上找到了如何阅读和如何写作的信息,但我对如何阅读和写作感到困惑。我需要启动两个事件基础循环吗?或者我可以以某种方式使用一个吗?下面是我在网上找到的发送代码示例(回调函数省略):
int err;
#ifdef _WIN32
WORD wVersionRequested;
WSADATA wsaData;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("WSAStartup failed with error: %d\n", err);
return false;
}
#endif
struct event_base *base;
struct bufferevent *bev;
struct sockaddr_in sin;
base = event_base_new();
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(0x7f000001); /* 127.0.0.1 */
sin.sin_port = htons(22346);
bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, NULL, NULL, eventcb, NULL);
bufferevent_enable(bev, EV_READ|EV_WRITE);
evbuffer_add_printf(bufferevent_get_output(bev), "WOOOOOOOOOOOOOO");
if (bufferevent_socket_connect(bev,
(struct sockaddr *)&sin, sizeof(sin)) < 0) {
/* Error starting connection */
bufferevent_free(bev);
return -1;
}
event_base_dispatch(base);
最佳答案
首先,您应该使用 bufferevent_write()
而不是较低级别的 evbuffer_add_printf()
- 前者更干净,底层 evbuffer 可能会被卡住。
您还禁用了读取和写入回调 - 因此当您可以从 bufferevent 读取数据时,您将不会收到回调。至少实现您的读取回调并通过 bufferevent_setcb() 设置它。也许这就是为什么你看不到任何事情发生的原因。
接下来,您可能会:
- 想要在连接时向对等方发送某些内容 - 当您在
eventcb
中获取连接事件 (BEV_EVENT_CONNECTED
) 时,请使用bufferevent_write()
回调。 - 连接后预计会从对等方收到一些内容 - 在这种情况下将调用您的读取回调。
关于c++ - 如何使用 libevent 在两个端点之间进行读写的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22260369/