recv http://linux.die.net/man/2/recvのマンページを読んでいますが、私が持っている質問に実際には答えていないので、ここで答えが得られることを願っています。
私はこのようにrecvを呼び出します:
numBytes = ::recv(getSocketId(), pData, nSize, MSG_DONTWAIT);
質問は次のとおりです。
- パッケージがバッファよりも大きい場合、recv は最大 nSize バイトを読み取り、メモリ ロケーションに配置します。戻り値は nSize ですよね?すべてのデータが受信されるまで、recv を再度呼び出すことができます。
- パッケージが nSize よりも小さい場合、rcv は使用可能なバイト数を読み取り、値 < nSize && >= 0 を返します。または、recv は nSize バイトが実際に受信されるまで待機しようとしますか? マニュアルページが正しいことを理解していれば、そうではないと思います (少なくともそうであることを願っています)。または、recv は -1 および errno = EAGAIN または EWOULDBLOCK で戻りますか?
- recv が -1 を返した場合、バッファはどうなりますか? その場合、それは常にそのままになりますか、それともデータの一部が既にそこに入れられている可能性がありますが、転送されたバイト数がわからないので、そうではないと思いますよね?
私がしたいのは、利用可能なバイト数を読み取ってから、転送されたバイト数を返すことです。追加のレイヤーでは、メッセージがどのように断片化されているかに関係なく、実際のメッセージを構築します。ただし、クライアントが何をしているのかを知ることができず、1 つの接続でサーバーを効果的にハングアップさせるべきではないため、サーバーが受信呼び出しでスタックすることは望ましくありません。