示例如何在两个端点之间使用libevent进行阅读和写作
Example for how to do reading AND writing between two endpoints with libevent?
我一直在努力设置此设置。我在网上找到了如何阅读以及如何做写作的信息,但是我很困惑如何进行阅读和写作。我需要启动两个事件基础循环吗?还是可以以某种方式使用一个?这是我在线找到的代码的示例(省略了回调功能):
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: %dn", 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++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- QT和Libevent中的信号和插槽之间的差异
- 示例如何在两个端点之间使用libevent进行阅读和写作