c++ - 如何使用 libevent 在两个端点之间进行读写的示例?

标签 c++ c networking tcp 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: %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/

相关文章:

C,使用 sqrt 和 math.h 时出现编译问题

c - C 的 Doxygen——多个对象

networking - 强制流量从一个 pod 到另一个

c++ - 合理支持的最低 GCC 版本是多少?

java - 如何使用 "DFLT-X"方法编写 Zip 文件

c++ - 给定一个大小为 true 的 bool 数组,我如何仅使用递归将所有值设置为 false?

c++ - C/C++ 中 pow() 函数的实现是否因平台或编译器而异?

c - 同一 printf 指令中的 itoa() 和 atoi() 无法正常工作

networking - 如何从其他机器上捕获数据包?

java - Windows 和 Linux 中 InetSocketAddress#getHostName 对于 "127.0.0.1"的不同行为