1

C のエコー サーバーと Python のテスト クライアントがあります。サーバーの読み取りバッファは制限されています (例: 16 バイト)。クライアントが 16 バイトを超える送信を行う場合、最初に 16 を読み取り、クライアントに書き戻してから再度読み取ります。

サーバーを でテストしたtelnetところ、16 バイトを超えていても、入力と同じ文字列が返されました。ただし、この Python クライアントは機能しません。

//data is initialized to be 20 bytes data
Len = 20
sock.setblocking(1)
sock.send(data)
recvdata = sock.recv(Len)
if(recvdata != data):
    print recvdata.encode('hex')
    print Len
    print data.encode('hex')

このクライアントは、サーバーが書き戻す最初の 16 バイトのみを受け取ります。サーバー ログには 2 回の書き込み (16 + 4) が表示されます。Pythonの出力は次のようになります

1234567890123456 //recvdata
20
12345678901234567890 //sent data

なぜこれが起こっているのかわかりません.ブロッキングrecv()が要求されたよりも少ないデータを返すのはなぜですか?

4

1 に答える 1

8

あなたが与える長さrecvは最大であり、目標ではありません. recvバイトが受信されるまで待機するという保証はありませんLen。データを読み取るとすぐに戻ることができます。

のマニュアルページにrecvは、次のように記載されています。受信呼び出しは、通常、要求された全量の受信を待つのではなく、要求された量まで利用可能なデータを返します。

特定のバイト数を読み取る必要がある場合recvは、ループを呼び出して、十分に読み取るまで返されたパケットを連結する必要があります。

于 2011-09-15T22:15:01.873 に答える