- PR -

winsockでの通信についてお伺いしたい事があります。

1
投稿者投稿内容
sandayu
会議室デビュー日: 2005/01/14
投稿数: 14
投稿日時: 2005-09-23 15:02
お世話になっております。sandayuと申します。

Windows2000 + WinSock + C言語でクライアント、サーバープログラムを組んでおります。

クライアントからデータをサーバーへ送信(send())し、サーバーより送信したデータを
クライアント側で受信(recv())しているのですが、このときサーバー側の送信ポートが
切断された事をクライアント側でキャッチするのに、recv()で取得したデータが0バイト
であるという条件を使用しております。

これで、サーバーの送信ポートの切断は認識できるのですが、サーバーの受信ポートを
切断した場合、クライアント側ではどのようにして認識すればよいのでしょうか?

send()関数で-1をキャッチした場合で対応可能でしょうか?

アドバイスよろしくお願いいたします。



甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-09-26 08:18
受信側と同じです。recvで0の時に閉じてください。sendで-1が返されるのは、あくまで送信エラーのときです。送信でエラーになったからと言って、切断されているとは限りません。

TCPには非正規の手順で切断された場合(ネットワークケーブルの断線など)、これを検出する手段は標準では提供されません。KeepAliveを有効にするか、自分自身で定期的にデータの送受信を行い、切断を検出する必要があります。
sandayu
会議室デビュー日: 2005/01/14
投稿数: 14
投稿日時: 2005-10-05 15:21
甕星さん返信有難うございます。

>TCPには非正規の手順で切断された場合(ネットワークケーブルの断線など)、これを検出する
>手段は標準では提供されません。KeepAliveを有効にするか、自分自身で定期的にデータの送
>受信を行い、切断を検出する必要があります。

なるほど。
実は、recvで0も完全ではないようで、PC1−@−HUB−A−PC2間での通信の際に、Aを切断
しても、PC1でそれをキャッチできなかったりという問題も発生しました。

本当に切断されたかどうかをキャッチするには、やはり定期的な通信で実現するのが
良いようです。
1

スキルアップ/キャリアアップ(JOB@IT)