4

状況:

ローカルホストの UDP ポート 33100 にバインドされたセンダーソケットがあります。ローカルホストの UDP ポート 33101 にバインドされたレシーバーソケットソケットがあります。

送信側ソケットは 4500 バイトのデータ (文字列 "hello man" * 500) を送信します。レシーバー側には、レシーバーソケットで EPOLLIN イベントを待機する epoll オブジェクトがあります。イベントがあるときは、次のことを行います。

while True:
    msg_received = receiver_socket.recv(128)
    if msg_received.decode("UTF-8") == "":
        break
    else:
        print msg_received.decode("UTF-8")

問題:

問題は、データの最初の 128 バイトを読み取った後、再度読み取ることができないことです。送信者側は、予想どおり 4500 バイトのデータを送信したと言っています。

送信者が同じ 4500 バイトのデータを再度送信すると、EPOLLIN イベントが再度登録され、新しい文字列が読み取られます。どういうわけか、最初の読み取り後にバッファがクリアされます。

送信者が 4500 バイトのデータを送信したばかりですが、最初recvに 128 バイトのデータがrecv返され、その後は何も表示されません。

私はおそらく本当にばかげたことをしているので、私に教えてください。4500 バイトのデータをすべて受信したい。

4

2 に答える 2

7

65535パケットのサイズがわからない場合は、常に (UDP パケットの最大サイズ) を指定して recv を呼び出す必要があります。それ以外の場合、 を呼び出すrecvと、パケット全体が読み取り済みとしてマークされ、バッファからクリアされますが、最初の128バイトのみが に供給されmsg_receivedます。

編集:ネットワーク経由でのみデータを受信するように移行する場合は、ドキュメントrecvに記載されているように、より小さな数を使用できます

于 2012-06-14T04:32:39.190 に答える
1

4500 バイトのデータを取得することがわかっている場合は、次のように呼び出すことができます。receiver_socket.recv(4500)

あなたのコードが言っていることは、読み取る最大バイト数が 128 であるということですreceiver_socket.recv(128)

ソケットについては、Python のドキュメントを参照してください。

于 2012-06-14T03:39:56.343 に答える