質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

105140閲覧

ソケットエラー10054 「既存の接続はリモート ホストに強制的に切断されました。」

nobysanz

総合スコア42

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2015/12/21 22:22

お世話になります。
2台のWindowsPCにて、UDP通信しているプログラムが、
ソケットエラー10054 「既存の接続はリモート ホストに強制的に切断されました。」にて、
エラーになりました。
このエラーの発生要因について、以下の内容と考え、再現させようとしていますが、
発生しません。本事象の発生要因についてご教授お願いいたします。

OS:Windows7
フレームワーク:2.0
UpdClientクラスにて作成

検証した手順(いずれも、事象が発生していません・・・)
(1)通信中に動作しているPCの、LANケーブルを抜く
→ 受信処理にて0バイトを受信し発生せず。

(2)対向の通信プログラムにて、UDPデータを受信したタイミングで、
ソケットをcloseする。
→ 受信処理にて0バイトを受信し、発生せず

(3)対向の通信プログラムにて、UDPデータを受信したタイミングで、
Application.exitで終了する
→ 受信処理にて0バイトを受信し、発生せず

(4)対向の通信プログラムにて、UDPデータを受信したタイミングで、
意図的にExceitonを発生させアプリケーションエラーさせる。
→ 受信処理にて0バイトを受信し、発生せず

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この手のエラーはタイミングの問題なので、再現させるには結構大変かもしれません。

原因についての直接の説明は下記ページの通りですが
Windows ソケットのエラー コード、値、および意味

既存の接続が、リモート ホストによって強制的に切断されました。このエラーは、通常、リモート ホストのピア プログラムが突然停止された場合、ホストが再起動された場合、またはリモート ホストが強制終了した場合に発生します。リモート ソケットの SO_LINGER オプションの詳細については、setsockopt (Wsapiref_94aa.asp) を参照してください。このエラーは、1 つまたは複数の操作の実行中に keep-alive 動作によってエラーが検出され、そのために接続が切断された場合に発生することもあります。

とのことですが、UDPとはご承知の通りTCPのようにコネクションを張るのではなく小間切れのデータグラムを垂れ流すような通信方式なので、ちょうどデータグラムを送出中(あるいは受信中)に、相手側のサーバーというよりは自身が直接接続しているネットワーク機器の状態の一時的な不具合とか、keep-alive動作のバッティングによってたまたま発生するのだと思います。

元々、エラーが発生するかもしれないことを織り込み済みで信頼性よりも速度を優先する通信方式なので、エラーハンドリングを工夫するしかないのですが、イントラネット上などでは設定により回避する方法もあるようです。ちょっと古い情報ですが・・・

[Windowsで10054接続切断エラーを回避するために](http://tech.4d-japan.com/Tips/2195/)

以上、いくらかでもご参考になれば幸いです。

投稿2015/12/21 23:42

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobysanz

2015/12/22 23:08 編集

回答ありがとうございます。やっぱりタイミングの問題なんですね。 ためしに、ローカル接続を、有効・無効にするコマンドをループで回して放置していたら、1回だけ発生しました。 ローカルエリア接続の有効・無効を繰り返す、永久ループスクリプト。 ```VB Script do Set objWShell = CreateObject("WScript.Shell") Set oExec = objWShell.Exec("netsh interface set interface ""ローカル エリア接続"" disabled") Call WScript.Sleep(200) Set oExec = objWShell.Exec("netsh interface set interface ""ローカル エリア接続"" enable") Call WScript.Sleep(6000) loop ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問