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

Posted

技术标签:

【中文标题】如何使用 libevent 在两个端点之间进行读写的示例?【英文标题】:Example for how to do reading AND writing between two endpoints with libevent? 【发布时间】:2014-03-07 20:47:51 【问题描述】:

我一直在为如何设置而苦苦挣扎。我在网上找到了如何阅读和写作的信息,但我对如何阅读和写作感到困惑。我需要启动两个事件库循环吗?或者我可以以某种方式使用一个吗?以下是我在网上找到的发送代码示例(省略了回调函数):

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);

【问题讨论】:

【参考方案1】:

首先,您应该使用bufferevent_write() 而不是较低级别的evbuffer_add_printf() - 前者更干净,并且底层的 evbuffer 可能会被冻结。

您还禁用了读取和写入回调 - 因此当您可以从缓冲区事件中读取时,您将不会收到回调。至少实现您的读取回调并通过bufferevent_setcb() 设置它。可能这就是为什么您看不到任何事情发生的原因。

接下来,你可能是:

想要在连接时向对等方发送一些东西 - 当您在 eventcb 回调中获得连接事件 (BEV_EVENT_CONNECTED) 时使用 bufferevent_write()。 一旦连接,预计会从对等方接收某些内容 - 在这种情况下将调用您的读取回调。

【讨论】:

我理解需要实现读取回调,我只是想发布一个编写示例。我是否需要创建两个缓冲事件套接字,一个用于读取,一个用于写入?这是我感到困惑的主要部分。我对 TCP 的理解不是很好,但我认为我需要两个套接字连接,对吗? 不,你需要一个socket和一个bufferevent。你可以写它来发送数据,当你的读回调被调用时,你可以从中读取。

以上是关于如何使用 libevent 在两个端点之间进行读写的示例?的主要内容,如果未能解决你的问题,请参考以下文章

libevent绑定监听和读写数据

libevent 1.4 版和 2.0 版之间的差异如何影响 libpcap 事件?

同一浏览器页面中两个端点之间的WebRTC?

Quarkus:如何在微服务之间进行身份验证?

两个微服务之间的通信

【socket】关于Unix域套接字(Unix Domain Socket)