4

ssize_t read(int fd, void * data, size_t count); 正確には何をしますか?

Webの多くの記事では、読み取りを試みる、または記述子fdが書かれていることがよくあります。どういう意味ですか?「やってみる」:/そして、そのようなソケットはどのように設計されていますか?OSは着信メッセージをバッファリングしますか?または、読み取りはタイムクリティカルな操作ですか?時間内に「読まない」と、一部のパッケージが失われる可能性はありますか?

編集:

なぜこれがブロックされないのか、しばらく疑問に思いました。次に、read(...)に、コードスニペットで見たすべての関数以外のパラメーターがあるのはなぜかと思いました。ついに私はそれがrecv (... )ではなくread (...)であることに気づきました。それでも私が期待したようにほぼ機能したのは不幸です。そして、私たちのascostaivie tohuhgtspalygeamsが私たちとどのように関係しているかを気にしないでください。(編集しないでください)ドイツ語の例が読者により多くの影響を与えることを認めなければなりません...

4

2 に答える 2

4

Linuxは、接続されたTCPソケットに到着するすべてのデータを、デフォルトで最大数メガバイトまでバッファリングします。データが到着するのと同時に正確に読み取る必要はありません。

netstat -tn接続されたソケットごとに、各方向にキューに入れられたバイト数が表示Recv-Qされます。Send-Q

于 2012-11-08T21:52:41.280 に答える
-1

Erik Ekmanが答えたように、あなたがそれをきちんと読まなくても、システムはある程度の量のデータをバッファリングします。

バッファがどんどんいっぱいになると、受信者のTCP / IP実装は、アドバタイズされた受信ウィンドウサイズを縮小し、ピアがより小さなデータチャンクを送信し、転送を効果的に抑制します。バッファがいっぱいになると、ウィンドウサイズはゼロになり、ピアは追加のデータを送信できなくなります。これが発生した場合でも、受信バッファがクリアされるとピアはパケットの送信を再開するため、データが失われることはありません。

正しいTCP/IP実装は、スキップによってデータが失われることがないことを保証します。接続は信頼性があり、機能しているか、完全に失われます。これは、read-1を返すことで示されます。

于 2012-11-08T22:57:36.620 に答える