2

簡単に言うと、Cでミックスネットを実装しています。これを行うために、TCPポートのセクション(たとえば31001-31008)をリッスンし、それらのポートでデータを受信して​​配置するいくつかの個別のデーモンを作成しています。バッファ(たとえば、TCPポート31002-> char * data [2])に入れ、最終的に、別のポートセット(たとえば、51001-51008)のデータをリスト内の次のデーモンに書き込みます。

それが邪魔にならないので、これが私の混乱です!私はここや他の場所で多くのことを読み、これを達成する最も簡単な方法はlibevent2を使用することであると判断しました。私は基本的にこれから始めています(ページの下部): http: //www.wangafu.net/~nickm/libevent-book/Ref8_listener.html ...ただし、1つではなく8つのポートを開いています。

質問:マニュアルを読みましたが、データがどのポートからのものであるかを判断する方法について少し混乱しています。たとえば、ポート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
4

1 に答える 1

2

ポートごとに1つのコールバックを使用できますが、そのコールバックは、正しい配列インデックスを使用して実際のコールバックを呼び出すプロキシとしてのみ機能します。

マクロでいくらか自動化することもできます。

#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

于 2012-10-08T05:49:22.063 に答える