0

最近はネットワーク プログラミング (特に P2P システム) を扱っています。私が扱う通常のプログラムは、どこかに次のようなものがあります(独自のスレッドで実行されています):

while True:
    handle(receive())

依存する一連の送受信アクションを処理するにはどうすればよいですか。たとえば、次のようなものが必要な場合:

def inviteNode(receiver):
    send(receiver, INVITE)

    if receive() == OK:
        send(receiver, SOME_INFORMATION)
        ...

互いに依存し、特定の順序を持​​ついくつかの送受信アクションを意味します。上記のようなものがあると便利ですinviteNode()(プロトコルのすべてのステップがコード内の同じ場所にあり、コードを見るだけで順序をたどることができるため) がreceive()、リッスン ループ外の呼び出しはうまくいきません。どちらreceive()がデータを受信するかをどのように決定する必要があるためです。

これに対する唯一の解決策は、グローバルな状態を持つことですか? 最初の操作を行った後、その特定のノードからsend(receiver, INVITE)を受信することを期待している場所を記憶する必要がありますか? これらの依存する送信/受信アクションがいくつかある場合、これは非常に複雑ではありませんか?OKINVITE

PS: 念のため: これは UDP 接続に関するものです。

4

1 に答える 1

0

ソケットポーリングを使用する必要があるようです。select() システム コール (クロスプラットフォーム ソリューションですが、特別なシステム依存 API ほど高速ではありません) を使用するか、Linux をターゲットにしている場合は、epoll API を使用してみてください。

主なアイデアは次のとおりです。いくつかのネットワークソケットがあり、それらはさまざまな状態にある可能性があります(たとえば、データを受信できます)。

いくつかのイベント (読み取り、書き込み、例外) についてこのソケット セットをクエリし、必要なものに応じて必要なアクションを実行できます。

たとえば、Nginx http サーバーはこのアーキテクチャを使用します。

また、コンテキストを保存する必要があります。たとえば、どのソケットに通知してチェックする必要があるか、どのデータが既に受信または送信されているか、および必要なその他の情報です。

これは少し複雑ですが、ジョブを実行できます:有限状態マシン.

于 2012-12-14T13:00:49.810 に答える