【发布时间】: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++。