0

現在、クライアントには 2 つのネットワーク インターフェイスがあります。各インターフェイス IP にバインドする 2 つの個別のソケットを作成しました。現在、2 つのサーバーがあり、それぞれがクライアントの 1 つのソケットと通信しています。両方のインターフェイスから同時に (現在は UDP または DGRAMS を使用して) データ (今のところ最大 10MB ですが、後で大きくなります) を受信できるようにしたいのですが、何らかの理由で、1 つのデータ転送を終了する必要があるため、常に遅延が発生します。他のソケットで転送を開始する前に、ソケット。

各インターフェースのバインドが成功し、各ソケットでそれぞれのサーバーと通信できることを確認しました。現在、同じコード ブロック内でs1.recv()実行するだけです。s2.recv()

だから私の質問は、使用の「ブロッキング」機能による遅延recv()ですか? また、私の検索では、機能をブロック解除する方法があるようです? しかし、それを行う方法がわかりません...そして、これはマルチスレッドを使用することで解決されますか? 私はマルチスレッドに少し慣れていませんが、問題が解決した場合は調査します。そうでない場合、両方のインターフェイスから並行して送受信できるようにするには、どうすれば両方のインターフェイスを利用できますか?

誰かが助けてくれれば、とても感謝しています。

4

1 に答える 1

1

recv関数はデフォルトでブロッキングです。これは、このソケットで何かが受信されるまで、メソッドが制御フローを停止することを意味します。を呼び出してから を呼び出すsock1.recv()と、sock2.recv()ソケット 1 が何かを受信したときにのみ 2 番目の呼び出しに到達します。

setblockingメソッドを使用してrecvノンブロッキングにすることで、受け取るものがなくてもすぐに返すことができます。ただし、新しいバイトを読み取るには、おそらく両方のソケットをポーリングする必要があります。

s1.setblocking(False)
s2.setblocking(False)

while True:
    # In non-blocking mode, recv throws a socket.error when
    # there is nothing to receive.
    try: a = s1.recv()
    except socket.error: a = None

    try: b = s2.recv()
    except socket.error: b = None

    handle_data(a,b) # Use received bytes at your discretion

またはモジュールrecvを使用して、2 つの呼び出しを並列化できます。multiprocessingthreading

class SocketThread(threading.Thread):
    def run():
        while True:
            a = self.sock.recv() # This time, recv in blocking mode
            handle_data(a)

t1, t2 = SocketThread(), SocketThread()
t1.sock = sock1
t1.start()

t2.sock = sock2
t2.start()
于 2013-01-24T15:20:36.533 に答える