使用libevent在C中进行TCP端口事件回调

时间:2012-10-07 21:30:34

标签: c tcp libevent

总而言之,我在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

1 个答案:

答案 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_1callback_2等的函数。