2

长话短说,我在 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
4

1 回答 1

2

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

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

#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

于 2012-10-08T05:49:22.063 回答