示例如何在两个端点之间使用libevent进行阅读和写作

Example for how to do reading AND writing between two endpoints with libevent?

本文关键字:libevent 之间 端点 两个      更新时间:2023-10-16

我一直在努力设置此设置。我在网上找到了如何阅读以及如何做写作的信息,但是我很困惑如何进行阅读和写作。我需要启动两个事件基础循环吗?还是可以以某种方式使用一个?这是我在线找到的代码的示例(省略了回调功能):

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()
  • 连接后,期望收到对等的东西 - 在这种情况下,您的读取回调将被调用。