0

select 呼び出しを使用して、書き込みソケット fd からデータを send() したいと考えています。非ブロッキングソケット実装を使用します。どの実装が優れているか。

while(u4BytesSent < u2BufLen)
{

    i4RetVal = send(sockFd, au1Buf + u4BytesSent, (u2BufLen - u4BytesSent));
    if(i4RestVal == -1 && errno != EWOULDBLOCK)
    {
        break;
    }
    i4BytesSent = i4BytesSent + i4RetVal;   
}

送信バッファが頻繁にいっぱいになると、このコードは CPU を占有しますか?

また

無限のタイムアウトで Select 呼び出しを使用します。

4

1 に答える 1

1

送信バッファが頻繁にいっぱいになると、このコードは CPU を占有しますか?

はい。また、エラー時に のエラー戻り値-1i4BytesSent繰り返し追加することになるため、正しく動作しません (クラッシュする可能性が最も高い)。

select()無限 (または、少なくとも非常に長い) タイムアウトで使用すると、正常に動作するはずです。ソケットでデータが利用可能になるまで、プロセスはスリープします。

あなたが説明していることを考えると、ノンブロッキングソケットを使用しないほうがよいでしょう。select()とにかく書き込み操作をブロックするためにそれらをラップするだけでは、確かに意味がありません!

于 2013-05-19T17:30:06.580 に答える