1

私はepollを使用してネットワークプログラミングに取り組んでいます。サーバーがクライアントが送信したすべてのデータを受信しなかったという状況を考えていました。たとえば、クライアントが 100 バイトを送信し、サーバーが 94 バイトしか受信しなかったとします。このケースをどのように処理しますか?

前もって感謝します..

4

1 に答える 1

3

epollは準備ができていることを示しますが、データ量についての保証はありません。EPOLLINは、記述子に対する次の読み取り操作がブロックされず、少なくとも1バイトを読み取るという保証のみを提供します。
通常、さまざまな(部分的にOS固有の)理由で記述子を非ブロッキングに設定するため、通常のイディオムはEAGAINが返されるまで読み取ることです。それが予想よりも少ないデータである場合(たとえば、「私のサイズは100バイトです」というヘッダーのあるメッセージがある場合)、次のEPOLLIN(またはEPOLLHUP)を待って、繰り返します(または中止します)。

TCPの場合、予想よりも少ないデータを受信することは、絶対に正常な状態です。繰り返す。

UDPでは、小さすぎるバッファーを指定しない限り(これにより、残りが破棄されます!)、これは発生しません。決して、これまで。UDPは、一度にデータグラム全体を配信するか、何も配信しません。部分的な配達はありません。IPフラグメンテーションが発生した場合、UDPはすべてのフラグメントを1つのデータグラムに再構成し、データグラム全体を配信します。フラグメントが失われた場合、UDPは何も配信しません。

于 2011-06-21T17:34:40.597 に答える