- - PR -
c# socket マルチスレッド
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-04-25 19:57
投稿させていただきます。
わかる方いましたら教えてください 言語: c# 環境: windowsxp サーバー(マルチスレッド)とクライアントのソケット通信プログラム作ってるけど socket の send を使ってサーバーからクライアントにメッセージ送ってます 私の理解では socket は send で送ると メッセージが普通に届いたら バイト数がレスポンスとして戻ってきますが 今の問題は クライアントが切れた場合もサーバーのソケットは send 使ってメッセージ送ると 正しいバイト数戻ってきました エラーもならないです そしたら サーバーからクライアントの切れたかどうかを判断できないということですか? よろしくお願いします _________________ | ||||
|
投稿日時: 2006-04-26 10:30
send()はOS内部の送信バッファに書き込めた時点で成功を返します。 通信相手からshutdown()やclose()等をされた場合は、それを検出した 以降のsend()の呼び出しが失敗、もしくはrecv()がゼロを返すので それを利用した切断の判断をする必要があります。 | ||||
|
投稿日時: 2006-04-29 17:12
「切断」と言っても、物理層での断線から、close()やshutdown()などの ネットワーク層/トランスポート層での切断、通信相手が反応しないための タイムアウト等いろいろありますし、通信相手のホストとは非同期ですので、 send()前に接続状況を確認したとしても、その後にsend()した時には相手が ダウンしている可能性すらありえます。 そもそもTCP/IPは一回の送信毎にACKを受けるような作りになっていないので、 前回のsend()が確実に届いているのか判定する手段すらありません。 それに送信毎に確認していたらとても遅くなってしまうでしょう? アプリケーション側のプロトコルで必要に応じてレスポンス(ACK)を受けるか、 通信前に状況確認のPING/PONGをやりとりして信頼性を上げる程度でしょうか。 ネットワークの世界では、実際に通信しない事には確かなことはわからないのです。 | ||||
|
投稿日時: 2006-04-29 17:38
以前、大域が低い回線を使った業務系システムを作った時、データが確実に処理さ れたことを確認させるために、 (1)送信メッセージID付きで送信 (2)メッセージIDを送り返す。 (3)メッセージIDを受け取って処理終了 の手順を踏ませました。(今は、自分でこんなことしなくても良いのかな?) もっともC/Sともに自分で開発する場合でないと意味ないですけどね。 | ||||
|
投稿日時: 2006-05-25 20:16
クライアントが切断されたかどうかの判別には、
SocketのReceiveメソッドを使いました。 切断されていると、 Receiveメソッドの戻り値が0になるので。。 また、クライアントも、.NETのSocketクラスを使用していれば、 切断されたときに、ReceiveメソッドでExceptionを発生するようです。 これで大丈夫なのかわかりませんけど^^; |
1