2

多くのオープン ソース フレームワークと tcp/ip のベスト プラクティスでは、トランスポート用に tcp レイヤーに渡したバッファーを再利用しないように提案しているのを見てきました。その背後にある理由は何ですか?バッファが単にカーネルにコピーされるというのは真実ではないので、バッファを再利用しないことについてのパルナオイアは何ですか? 上記の典型的な例は次のようになります

char data[1024] = {'1', '2'.................'1024'};
write(socket, data, 1024);
data = {'a', 'b','c'...........};  //reusing the buffer 

ZeroMQ は、バッファを作成して削除するための API を提供しますが、使用しないことを強くお勧めします。Netperf はリングバッファを作成し、現在ソケットに書き込んでいるバッファを再利用しないようにします。

4

1 に答える 1

2

write()どちらもsend()TCPの「送信ウィンドウ」にデータをコピーするため、これらの呼び出し後にプログラム内でデータを変更することを心配する必要はありません。ただし、ノンブロッキング ソケットはすべてのデータをコピーしない可能性があるため、リターン コードをチェックして、実際に書き込まれたバイト数を確認する必要があります。

おそらく非常に小さな組み込みシステム用のカスタム TCP スタックでは、データを維持する必要がありましたが、主流の OS ではそのような必要はありませんでした。

于 2012-11-20T16:48:47.540 に答える