总而言之,我在C中实现混合网。为此我创建了几个单独的守护进程,它们监听TCP端口的一部分(比如31001-31008),接收这些端口上的数据并将其放入缓冲区(比如TCP端口31002 - > char * data [2]),然后最终将数据写入另一组端口(例如51001-51008)到列表中的下一个守护进程。 / p>
有了这个,这就是我的困惑!我在这里和其他地方做了很多阅读,并认为最简单的方法是使用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
答案 0 :(得分: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_callback
以及一组名为callback_1
,callback_2
等的函数。