2016-10-12 5 views
0

比較的簡単な質問:Linuxの非ブロッキングソケットを使用してrecv()を実行する場合、どのくらいのデータを受信できるかを事前に判断する方法がありますか?Linuxノンブロッキングソケット:ブロックする前にどれだけのデータを読み取ることができますか?

私はいつも余分なrecv()コールをやって、すべてのデータが消耗したと判断するようです。

+2

もしあなたがその情報を得ることができたら、それはあなたがそれに取り組む前に既に陳腐化しているでしょう... –

+1

「ブロックする前に」とはどういう意味ですか?これは非ブロッキングソケットです。ブロックされません。 EAGAIN/EWOULDBLOCKが発生するまで 'recv()'を呼び出すことができます。あなたが何を求めているのか不明です。 – EJP

答えて

2

ioctl()FIONREADを使用すると、ソケットバッファ内の未読バイト数を取得できます。

しかし、それはダブルシステムコールでもあり、recv()を呼び出す前にもっと多くのデータが届いているとは限りません。

しかし、簡単な方法があります - recv()と呼ぶことができ、実際に読み取られたバイト数を返します。実際に読み込まれたバイト数が要求されたバッファーと同じ場合にのみ、呼び出しを繰り返す必要があります。あなたがコールを繰り返さなくても、次のselect()コールは、読み込み可能なデータがまだあるかどうかを返します。

+0

私は確かにrecv(readのような)はあなたに合ったバイト数を自由に与えることができ、それはあなたのバッファサイズよりも小さい値を返すからといって、データがないことを意味するわけではありません。 – rivenmyst137

+0

@ rivenmyst137:Posixはおそらくこれを保証していませんが、そうでなければ動作するような実装は見ていません。とにかく 'recv()'と 'select()'の組み合わせは、どんな場合でも動作します。 –

0

recvのMSG_PEEKフラグを使用して、ソケットバッファから読み取る現在のバイト数を判断できます。データを処理する前に、アプリケーションが決められたバイト数だけ待機している場合、アプリケーションはMSG_PEEKに依存しています。データはソケットバッファから削除されません。しかし、retは、MSG_PEEKなしで読むと同じ値になります。アプリケーションが必要とするような多くのバイトまで、余分なシステムコールで

ret = recv(sd, buf, MAX_CALL_DATA_SIZE, MSG_PEEK);

この方法の結果は、ソケットバッファです。また、実際にデータをアプリケーションに読み込むまでに、より多くのバイトが到着することは保証されていません。

関連する問題