• ベストアンサー

ソケットのrecvの戻り値が0

linuxにてソケットの勉強をしようと思い、 簡単なソケット通信のプログラムをCで組みました。 ret = recv(ID, Buff, sizeof(Buff), 0); といった感じでサーバ側を組んだのですが、 この戻り値retに0が入ることがあり、思うように動いてくれません。 私の認識だと、recvは受信するまで待ち、 受信したサイズを返すと思っているのですが、 それが0とは、いったいどういう意味を持つのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • shige_70
  • ベストアンサー率17% (168/946)
回答No.3

recv()の切断時の返り値は-1とは限りません。 むしろ、通常の切断では0以上が返ると思ってください。 つまり、recv()の返り値だけで切断を検出することは出来ません。 単純に1回の接続で短いデータを1回受信するだけのような場合はrecv()が返ってきた時点で切断されていると見なすことは出来るでしょう。 通常は、プロトコルで切断手順を定めて、切断することがプログラムで分かるよう工夫します。 例えば、終了時には必ず"EOF"という行を送るようにする、等です。 しかし、クライアントが強制終了した場合などは上記方法では対応できないので、alarm()を用いて一定時間通信がなければ自動終了するようにするなどしてタイムアウトを定めるわけです。 もちろん、可能ならばクライアント側で強制終了時もシグナルを拾って切断手順を実行できるようにすることも大事です。

pinch-i
質問者

お礼

回答ありがとうございます。 なるほど、切断状態でも-1とは限らないのですね。 alert()を勉強してみます。

その他の回答 (2)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 recv の復帰値が0 は、確か相手プロセスとの コネクション切断だった筈です。

回答No.1

んー、パッと見で非ブロッキングになってるんじゃないかな、とか思ったんですが。 エラーやら切断なら -1 が返却されると思うんで(うろ覚えです) fcntlで非ブロッキングに設定してある、とかではないですかね?

pinch-i
質問者

補足

回答ありがとうございます。 非ブロッキングに設定はしていません。 (存在すら知りませんでしたが。。。) 一応ブロッキングにしてやってみましたが、同じでした。 どうやら、相手(クライアント側)のプログラムをSIGINT等で終了させると起こるようです。 無限ループの中でrecvをさせてますので、 相手側を終了させると、受信サイズ0で進んで、 ひたすらrecvを繰り返しています。 この場合、おっしゃる通り -1 で返却されるのであれば理解できるのですが。。。

関連するQ&A