C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: TCP/IP通信の送信メソッドでエラー検知できませんか?


(過去ログ 38 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■19825 / inTopicNo.1)  TCP/IP通信の送信メソッドでエラー検知できませんか?
  
□投稿者/ 夢若 (1回)-(2008/05/30(Fri) 15:14:17)

分類:[.NET 全般] 

2008/05/30(Fri) 17:18:31 編集(投稿者)
2008/05/30(Fri) 17:18:23 編集(投稿者)

初めまして。いつも参考にさせて頂いております。

今回、非同期TCP/IP通信にてデータを送受信するプログラムを組みました。
その際、Client側よりSocket.NetworkStream().Writeメソッドを使用しデータの送信をしているのですが
LANが抜けている状態でデータ送信してもSocket.NetworkStream().Write()メソッドはExceptionも出さず
送信できた と認識しています。
その後暫く(5〜20秒ほど)待つと受信のコールバックメソッドのSocket.EndReceive()にてExceptionを出し
初めてエラーが認識されます。

私のやりたい事はSocket.NetworkStream().Write()メソッドにて
送信処理をした所で切断を検知したい(LANが抜けているので送信できない=切断)のですが
なにか良い方法はあるでしょうか?

宜しくお願いします。

追記
int len = 0;
len = Socket.Send();
にて戻り値の判断をしてみましたが、データが送信された物として正常な送信バイト数がlenに戻ってきました。
判断する方法は無いのでしょうか…
引用返信 編集キー/
■19829 / inTopicNo.2)  Re[1]: TCP/IP通信の送信メソッドでエラー検知できませんか?
□投稿者/ はつね (759回)-(2008/05/30(Fri) 17:46:03)
はつね さんの Web サイト
No19825 (夢若 さん) に返信
> 今回、非同期TCP/IP通信にてデータを送受信するプログラムを組みました。
(中略)
> 私のやりたい事はSocket.NetworkStream().Write()メソッドにて
> 送信処理をした所で切断を検知したい(LANが抜けているので送信できない=切断)のですが
> なにか良い方法はあるでしょうか?

非同期だとしたら無理。

引用返信 編集キー/
■19830 / inTopicNo.3)  Re[2]: TCP/IP通信の送信メソッドでエラー検知できませんか?
□投稿者/ 夢若 (3回)-(2008/05/30(Fri) 18:03:43)
2008/05/30(Fri) 18:46:57 編集(投稿者)
2008/05/30(Fri) 18:45:41 編集(投稿者)

No19829 (はつね さん) に返信
> ■No19825 (夢若 さん) に返信
>>今回、非同期TCP/IP通信にてデータを送受信するプログラムを組みました。
> (中略)
>>私のやりたい事はSocket.NetworkStream().Write()メソッドにて
>>送信処理をした所で切断を検知したい(LANが抜けているので送信できない=切断)のですが
>>なにか良い方法はあるでしょうか?
>
> 非同期だとしたら無理。
>
そうですか。回答有難う御座います。
同期だと出来ると言う事でしょうか?

実装方法や参考になるサイトや文献などありましたら教えて頂けると幸いです。

追記
なぜ
>>私のやりたい事はSocket.NetworkStream().Write()メソッドにて
>>送信処理をした所で切断を検知したい(LANが抜けているので送信できない=切断)
をやりたいかと言うと、送信できなかった際に相手(サーバ側)のエラーなのか、こちら(クライアント側)のエラーなのかの切り分けがしたいのです。

宜しくお願いします。
引用返信 編集キー/
■19836 / inTopicNo.4)  Re[3]: TCP/IP通信の送信メソッドでエラー検知できませんか?
□投稿者/ はつね (760回)-(2008/05/30(Fri) 19:12:34)
はつね さんの Web サイト
No19830 (夢若 さん) に返信
> >>今回、非同期TCP/IP通信にてデータを送受信するプログラムを組みました。
>>(中略)
> >>私のやりたい事はSocket.NetworkStream().Write()メソッドにて
> >>送信処理をした所で切断を検知したい(LANが抜けているので送信できない=切断)のですが
> >>なにか良い方法はあるでしょうか?
>>
>>非同期だとしたら無理。
>>
> そうですか。回答有難う御座います。
> 同期だと出来ると言う事でしょうか?

http://msdn.microsoft.com/ja-jp/library/bbx2eya8(VS.80).aspx
ここに「非同期クライアント ソケットでは、ネットワーク操作の完了までアプリケーション
の実行が中断される、ということはありません。」と明記されているように、非同期のとき
は、完了まで待たずに(つまりエラーを検出まで待たずに)次のステップに実行が移り、
同期だったら、完了をまってから次のステップに進みます。

しかし、同期であれば大抵の場合タイムアウトまで待ってからエラーで返却されてくるので
エラーがその行で検出できますが、TCP/IP的には必ずしもすべてが検出できるとは限らない
はず。


> をやりたいかと言うと、送信できなかった際に相手(サーバ側)のエラーなのか、こちら
> (クライアント側)のエラーなのかの切り分けがしたいのです。

相手からdisconnectされたのならば分かりますが、通常の切断シーケンスとして検出でき
ますが、LANケーブル切断は相手側なのかこちら側なのかは分からないと思いませんか?
だって、途中のLANケーブルがはずれたときって、相手でもなく自分でもないですよね?
分かるのは、どこかで通信経路が切断されていて、迂回経路もないって事だけ。


引用返信 編集キー/
■19840 / inTopicNo.5)  Re[4]: TCP/IP通信の送信メソッドでエラー検知できませんか?
□投稿者/ 夢若 (4回)-(2008/05/30(Fri) 19:52:13)
No19836 (はつね さん) に返信
> http://msdn.microsoft.com/ja-jp/library/bbx2eya8(VS.80).aspx
> ここに「非同期クライアント ソケットでは、ネットワーク操作の完了までアプリケーション
> の実行が中断される、ということはありません。」と明記されているように、非同期のとき
> は、完了まで待たずに(つまりエラーを検出まで待たずに)次のステップに実行が移り、
> 同期だったら、完了をまってから次のステップに進みます。
>
> しかし、同期であれば大抵の場合タイムアウトまで待ってからエラーで返却されてくるので
> エラーがその行で検出できますが、TCP/IP的には必ずしもすべてが検出できるとは限らない
> はず。
ふむふむ…そうなのですか。
勉強になります。 
C言語でsend()を行うと送信できなかった時は戻り値が-1で帰ってくることにより送信エラーを検知出来ますよね?
それと同じような事が出来ないかと思っているのですが、同期式、非同期式に関わらずなにか良い方法はないでしょうか…

>>をやりたいかと言うと、送信できなかった際に相手(サーバ側)のエラーなのか、こちら
>>(クライアント側)のエラーなのかの切り分けがしたいのです。
>
> 相手からdisconnectされたのならば分かりますが、通常の切断シーケンスとして検出でき
> ますが、LANケーブル切断は相手側なのかこちら側なのかは分からないと思いませんか?
> だって、途中のLANケーブルがはずれたときって、相手でもなく自分でもないですよね?
> 分かるのは、どこかで通信経路が切断されていて、迂回経路もないって事だけ。
>
LANケーブル切断に対しての意見、有難う御座います。
自分の頭の中が纏まりました。この問題は理解しました。

引用返信 編集キー/
■19844 / inTopicNo.6)  Re[5]: TCP/IP通信の送信メソッドでエラー検知できませんか?
□投稿者/ はつね (761回)-(2008/05/30(Fri) 21:29:00)
No19840 (夢若 さん) に返信
> C言語でsend()を行うと送信できなかった時は戻り値が-1で帰ってくることにより
> 送信エラーを検知出来ますよね?

それがいわゆる同期なときの動きですね。
大抵のときは返ってくれるけど必ず検出して-1になるというものではなかったはず。
#OSとかハードなどでも違うかもだけれど。

なので、同期で戻り値判定する + disconnectイベント + エラーイベント
など他にも関連しそうなイベントもちゃんと処理するのが必要かも。

引用返信 編集キー/
■19912 / inTopicNo.7)  Re[6]: TCP/IP通信の送信メソッドでエラー検知できませんか?
□投稿者/ 夢若 (5回)-(2008/06/02(Mon) 09:28:02)
返信遅れてスミマセン。わかりやすく有難う御座います。

No19844 (はつね さん) に返信
> ■No19840 (夢若 さん) に返信
>>C言語でsend()を行うと送信できなかった時は戻り値が-1で帰ってくることにより
>>送信エラーを検知出来ますよね?
>
> それがいわゆる同期なときの動きですね。
あー。そう言う事ですか。会話の流れでの理解となりますが
Sendを行うことにより送信動作を行うが、Sendがタイムアウトで返って来た為に戻り値が「-1」になると言う考え方で宜しいでしょうか?

> 大抵のときは返ってくれるけど必ず検出して-1になるというものではなかったはず。
> #OSとかハードなどでも違うかもだけれど。
>
> なので、同期で戻り値判定する + disconnectイベント + エラーイベント
> など他にも関連しそうなイベントもちゃんと処理するのが必要かも。
処理詳細の注意すべき箇所の教授、有難う御座います。
注意して作成してみます。

大変良く分かりました。 はつね様お付き合い頂き誠に感謝いたします。
また何かありましたらお世話になることがあるかもしれませんが、その時は何卒宜しくお願い致します。

この問題はこれにて解決済みとさせて頂きます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -