长话短说,我在C中实现了一个混合网络。为此,我创建了几个单独的守护进程,它们监听一段TCP端口(比如31001-31008),接收这些端口上的数据并将其放入缓冲区(比如TCP端口31002->char*data[2]),然后最终将另一组端口(比如51001-51008)上的数据写入列表中的下一个守护进程。
别这样,这是我的困惑!我在这里和其他地方读了很多书,并决定最简单的方法是使用libevent2。我基本上是从这个开始的(在页面底部):http://www.wangafu.net/~nickm/libfevent-book/Ref8_listener.html…除了我打开了8个端口而不是1个。
问题:我已经通读了手册,但对于如何确定数据来自哪个端口,我有点困惑。例如,如果我在端口31004上接收到数据,我想知道如何将其写入数据[4]。
我想过为我打开的每个端口创建一个不同的回调,但这变得很糟糕。有没有更简单的方法?
以下是我正在努力实现的一些psuedo代码,请随时提出建议!我也研究过在类似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
您可以为每个端口使用一个回调,但该回调仅充当使用正确数组索引调用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
等的函数。