私のアプリケーションは、solaris 10 で実行されています。これは C/S モデルです。同じサーバー内のクライアント プログラムとサーバー プログラム。クライアント プログラムのソケット送信バッファを 49512 に設定し、TCP_NODELAY オプションを設定しました。select のタイムアウト間隔は 1 秒です。クライアントの実行中に、ネット静的が非常に大きい場合、選択がタイムアウトになることがわかりました。どのアクションが原因でソケットが書き込み準備ができていないのかを知りたいです。送信バッファがいっぱい?または他の人?
1059 次
1 に答える
1
その通りです。送信バッファがいっぱいであるため、select() はタイムアウトします。
TCP プロトコルは配信を保証するため、ソケットの反対側の受信バッファーにデータが安全に到達したことを送信者が認識するまで、データは送信バッファーから削除されません。
これは、送信バッファがいっぱいになることを意味します。たとえば、受信側の受信バッファがいっぱいになった場合や、送信されたパケット (または受信者からの ACK) がネットワーク上で失われた場合などです。
select() がタイムアウトしない場合でも、送信バッファーがほぼいっぱいになる可能性があり、write() 呼び出しですべてのデータがバッファーに書き込まれるわけではありません。write() または send() 呼び出しの戻り値を常に確認してください。これにより、実際に書き込まれたバイト数がわかります
于 2012-01-06T15:17:14.650 に答える