使用 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_1
、callback_2
等的函数。
【讨论】:
这比我想象的要干净得多,谢谢!不过,我很好奇是否有内置的方法可以做到这一点。我将尝试实施您的建议,看看效果如何。 抱歉,我花了一段时间才回到这个帖子。我最终按照你的建议实施了这个,效果很好。再次感谢!以上是关于使用 libevent 在 C 中的 TCP 端口事件回调的主要内容,如果未能解决你的问题,请参考以下文章