8

Linuxでのソケットの動作を理解するのにいくつか問題があります。

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);

上記のコードでは、書き込みがバッファリングされているため、送信タイムアウトは意味がありません(書き込みシステムコールは、ユーザースペースバッファがカーネルバッファにコピーされるとすぐに返されます)。送信バッファサイズははるかに重要なパラメータですが、送信タイムアウトは価値がないようです。しかし、SO_SNDTIMEOを使用するコードをかなりたくさん見たので、私は確かに間違っています。受信機が非常に遅いと仮定して、SO_SNDTIMEOを使用してユーザースペースコードをタイムアウトするにはどうすればよいですか?

4

2 に答える 2

11

ノンブロッキングソケットで送信タイムアウトを設定するにはどうすればよいですか?

そうではありません。タイムアウトはブロッキングモード用です。非ブロッキングrecv()はブロックされないため、タイムアウトすることもできません。

SO_SNDTIMEOを使用するコードをたくさん見ました。

関連するコードがナンセンスでない限り、非ブロッキングモードではありません。

于 2012-11-26T01:25:15.643 に答える
5

SO_SNDTIMEOは、ブロッキングソケットに役立ちます。ソケットのバッファがいっぱいの場合、send()はブロックできます。その場合、SO_SNDTIMEOソケットオプションを使用すると便利な場合があります。非ブロッキングソケットの場合、ソケットのバッファーがいっぱいになると、送信はすぐに失敗するため、非ブロッキングソケットでSO_SNDTIMEOを設定しても意味がありません。

于 2012-11-26T01:05:50.173 に答える