- PR -

c# socket マルチスレッド

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2006/04/24
投稿数: 30
投稿日時: 2006-04-25 19:57
投稿させていただきます。
わかる方いましたら教えてください

言語: c#
環境: windowsxp

サーバー(マルチスレッド)とクライアントのソケット通信プログラム作ってるけど
socket の send を使ってサーバーからクライアントにメッセージ送ってます
私の理解では socket は send で送ると メッセージが普通に届いたら
バイト数がレスポンスとして戻ってきますが

今の問題は クライアントが切れた場合もサーバーのソケットは send 
使ってメッセージ送ると 正しいバイト数戻ってきました エラーもならないです

そしたら サーバーからクライアントの切れたかどうかを判断できないということですか?

よろしくお願いします



_________________
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-04-26 10:30
引用:

未記入さんの書き込み (2006-04-25 19:57) より:
今の問題は クライアントが切れた場合もサーバーのソケットは send 
使ってメッセージ送ると 正しいバイト数戻ってきました エラーもならないです

そしたら サーバーからクライアントの切れたかどうかを判断できないということですか?


send()はOS内部の送信バッファに書き込めた時点で成功を返します。

通信相手からshutdown()やclose()等をされた場合は、それを検出した
以降のsend()の呼び出しが失敗、もしくはrecv()がゼロを返すので
それを利用した切断の判断をする必要があります。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-04-29 17:12
引用:
send()を使う前にクライアントが切断されたかどうかを検出したいけど
  検出する方法は何だろう?


「切断」と言っても、物理層での断線から、close()やshutdown()などの
ネットワーク層/トランスポート層での切断、通信相手が反応しないための
タイムアウト等いろいろありますし、通信相手のホストとは非同期ですので、
send()前に接続状況を確認したとしても、その後にsend()した時には相手が
ダウンしている可能性すらありえます。

そもそもTCP/IPは一回の送信毎にACKを受けるような作りになっていないので、
前回のsend()が確実に届いているのか判定する手段すらありません。
それに送信毎に確認していたらとても遅くなってしまうでしょう?

アプリケーション側のプロトコルで必要に応じてレスポンス(ACK)を受けるか、
通信前に状況確認のPING/PONGをやりとりして信頼性を上げる程度でしょうか。
ネットワークの世界では、実際に通信しない事には確かなことはわからないのです。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-29 17:38
引用:

未記入さんの書き込み (2006-04-25 19:57) より:

今の問題は クライアントが切れた場合もサーバーのソケットは send 
使ってメッセージ送ると 正しいバイト数戻ってきました エラーもならないです



以前、大域が低い回線を使った業務系システムを作った時、データが確実に処理さ
れたことを確認させるために、

(1)送信メッセージID付きで送信
(2)メッセージIDを送り返す。
(3)メッセージIDを受け取って処理終了

の手順を踏ませました。(今は、自分でこんなことしなくても良いのかな?)
もっともC/Sともに自分で開発する場合でないと意味ないですけどね。
よしこ
会議室デビュー日: 2006/03/30
投稿数: 5
投稿日時: 2006-05-25 20:16
クライアントが切断されたかどうかの判別には、
SocketのReceiveメソッドを使いました。
切断されていると、
Receiveメソッドの戻り値が0になるので。。

また、クライアントも、.NETのSocketクラスを使用していれば、
切断されたときに、ReceiveメソッドでExceptionを発生するようです。

これで大丈夫なのかわかりませんけど^^;
1

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