1

まあ、Embarcaderoでさえ、ソケット バッファーで読み取る準備ができているバイトの正確な結果を返すことは保証されていないと述べていますが、それを見ると、Socket.ReceiveBuf に -1 を配置すると (これは ReceiveLength がラップするものです)、呼び出します。ioctlsocketFIONREAD を使用して、ソケット s から読み取ることができるネットワークの入力バッファーで保留中のデータの量を決定します

では、なぜ安全でも悪くもないのでしょうか?

例えば:ioctlsocket(Socket.SocketHandle, FIONREAD, Longint(i));

4

1 に答える 1

5

あなたが言及したドキュメントは具体的に述べています(強調は私のものです)

注: ReceiveLength は、ストリーミング ソケット接続に対して正確であるとは限りません。

これは、長さがデータのストリームによって供給されるため、事前にわからないことを意味します。明らかに、事前に送信されるデータの大きさがわからない場合、クライアントが期待する長さを適切に設定することはできません。

ファイルをコピーするための一般的なコードのように考えてください。コピーするファイルのサイズが事前にわからない場合、コピーするバイト数を予測することはできません。ソケットの場合、ソケットを提供しているストリーム サイズは事前にわかっていないため (たとえば、リアルタイムで生成されて送信されるデータの場合)、クライアント ソケットに予想されるサイズを通知する方法はありません。

于 2013-03-20T23:54:46.383 に答える