使用 libevent 在 C 中的 TCP 端口事件回调

Posted

技术标签:

【中文标题】使用 libevent 在 C 中的 TCP 端口事件回调【英文标题】:TCP port event callbacks in C using libevent 【发布时间】:2012-10-07 21:30:33 【问题描述】:

长话短说,我在 C 中实现了一个混合网络。为此,我创建了几个单独的守护进程,它们侦听一段 TCP 端口(比如 31001-31008),在这些端口上接收数据并将其放入缓冲区(例如 TCP 端口 31002 --> char *data[2]),然后最终在另一组端口(例如 51001-51008)上将数据写入列表中的下一个守护进程。

除此之外,这就是我的困惑!我在这里和其他地方做了很多阅读,并决定最简单的方法是使用 libevent2。我基本上是从这个开始的(在页面底部):http://www.wangafu.net/~nickm/libevent-book/Ref8_listener.html ... 除了我打开 8 个端口而不是 1 个。

问题:我已经阅读了手册,但我对如何确定数据来自哪个端口感到有些困惑。例如,如果我在端口 31004 上接收数据,我想知道将其写入数据 [4]。

我想过为我打开的每个端口创建一个不同的回调,但这变得很难看。有没有更简单的方法?

这是我想要完成的一些伪代码,请随时提出建议!我也研究过用 python 之类的东西来做这件事,但似乎 python 在事件方面也有同样的问题。

define baseport 31000
define numports 8

public char *data[numports];

callback:
    /* a connection was made */
    received_data = recv(blah)

    databin = port_received_on % baseport
    ////// How do i know what port it was received on? /////
    strncpy(data[databin], received_data, sizeof(data[databin]));

main:
    for (i = 1; i <= numports; i++)
            data[i] = malloc 

    struct event_base *base;
    //setup base event, etc.

    for (int i = 1; i <= numports; i++) 
            //setup localhost connection, open 8 ports
            sin.sin_port = htons(baseport + i);

    //configure listener with callback to "callback"
    

    dispatch

【问题讨论】:

这就是 C++ 比 C 好得多的地方。您可以轻松地使用 std::bind(),其中一个参数是 i(或 baseport + i)。自 2012 年以来,希望你改用 C++。 【参考方案1】:

您可以为每个端口使用一个回调,但该回调仅充当代理调用具有正确数组索引的 real 回调。

它甚至可以通过宏实现自动化:

#define DEF_CALLBACK(idx)      \
    void callback_ ## idx()    \
                              \
        real_callback(idx);    \
    

void real_callback(int idx)

    /* ... */


DEF_CALLBACK(1)
DEF_CALLBACK(2)
/* etc. */

现在你有了 real 回调函数 real_callback 以及一组名为 callback_1callback_2 等的函数。

【讨论】:

这比我想象的要干净得多,谢谢!不过,我很好奇是否有内置的方法可以做到这一点。我将尝试实施您的建议,看看效果如何。 抱歉,我花了一段时间才回到这个帖子。我最终按照你的建议实施了这个,效果很好。再次感谢!

以上是关于使用 libevent 在 C 中的 TCP 端口事件回调的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp libevent的库TCP通信示例

TCP网络编程杂谈

libevent源码分析-TCP服务端代码

使用 libevent 广播 TCP-Server

如何使用“C”在 Windows 中找到空闲的 TCP 端口

Ubuntu虚拟机安装evpp开源库说明