簡體   English   中英

使用libevent的C中的TCP端口事件回調

[英]TCP port event callbacks in C using libevent

長話短說,我正在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上接收到數據,我想知道將其寫入data [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

您可以為每個端口使用一個回調,但是該回調僅充當代理,使用正確的數組索引調用實際回調。

它甚至可以通過宏實現某種程度的自動化:

#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等的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM