2011-10-30 10 views
3

ブロックモードでTCPソケットを作成し、send(またはsendto)関数を使用すると、関数呼び出しが復帰するのはいつですか?ブロックモードのLinux TCPソケット

ソケットの反対側がデータを受信するまで待つ必要がありますか?その場合、インターネットに渋滞がある場合、それは長い間ブロックできますか?

答えて

3

送信者と受信者の両方(および場合によっては仲介者)がデータをバッファします。

データを正常に送信することは、受信側が受信したことを保証するものではありません。

通常、ブロッキングソケットに書き込みます。送信側のバッファに空きがある限りブロックしません。

送信者のバッファがいっぱいになると、書き込み全体にスペースができるまで、書き込みはブロックされます。

書き込みが部分的に成功した場合(受信者がソケットを閉じたり、終了したり、エラーが発生した場合)、書き込みは意図したよりも少ないバイト数を返す可能性があります。後続の書き込みはエラーを返すか、0を返します。このような状態はTCPソケット上で元に戻せません。

次のsend()またはwrite()でエラーが発生すると、以前に書き込まれたデータの一部が永久に失われる可能性があることに注意してください。私は実際にどのくらいのデータが実際に到着したかを知る本当の方法はないと思います。

+1

書き込みは、ブロックモードではゼロを返すことができません。何かが書かれるか、-1とerrnoが得られます。 – EJP

+0

@EJP:ピアが接続を正常に終了すると、書き込みCANはゼロを返します。異常な切断は-1を引​​き起こします。 –

+2

@ RemyLebeau-TeamBいいえ、それはread()とrecv()のみです。クローズされた接続へのwrite()またはsend()は、最終的に、errno == ECONNRESETで-1を返します。 – EJP