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

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

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

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

1691閲覧

Windows7のTCP通信でRST+ACKがサーバソケット側から送信されて通信が切断されるようになり、サーバソケット側WindowsOSを再起動しないと現象が復帰しない。

naitou

総合スコア141

C#

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

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

3クリップ

投稿2018/04/11 08:43

編集2018/04/12 00:29

Windows7のTCP通信でRST+ACKがサーバソケット側から送信されて通信が切断されるようになり、サーバソケット側WindowsOSを再起動しないと現象が復帰しない。

WindowsOS再起動で現象が復帰する為、497日問題の類のWindowsOSの不具合と考えますが、類似の現象をご存じの方は情報提供頂けないでしょうか。

RST+ACKが送信されるタイミングですが、サーバソケット側のリードタイムアウト時間を変更したタイミングが影響しているのではないかと思っています。なお他のTCP通信は行えている様で、下記処理のアプリケーションで動的にリードタイムアウト時間を変更しているせいではないかと思いました。

C#言語で作成したサーバ・クライアントモデムの通信処理で、サーバ側から見て次の様になっています。

「7.」のリクエスト受信から「8.」のレスポンス送信の間でRST+ACKを送信している様です。
なおアプリケーション的にどの様な例外が発生しているかはログが残っていないのでわかりませんが、通信が切断となり、「8.」のレスポンスは送信できていません。なおRST+ACKが送信されているのはサーバソケット側Windowsでワイヤーシャークを用いて確認しました。

1.サーバソケットListen 接続待ち

2.サーバソケット接続Accept 「3.」から処理用の新スレッドへ

3.クライアントソケットへ通信OK送信

4.リードタイムアウト2秒とし、通信OKのレスポンス待ち

5.通信OKのレスポンス受信

6.リードタイムアウト30分とし、クライアントからのリクエスト待ち

7.クライアントからのリクエスト受信 このタイミングあたりでRST+ACKが送信されていると思われます。

8.クライアントへレスポンス送信

「6.」へ戻る

試したこと

サーバソケット側アプリケーションを再起動 現象復帰ならず
クライアントソケット側アプリケーションを再起動 現象復帰ならず
サーバソケット側WindowsOSを再起動 現象が復帰した

netstat -anp tcpでtcpポート状態を確認していましたが、当該サーバポートはListenとなっておりました。TIME_WAITが大量に残っていることもありませんでした。

補足情報(FW/ツールのバージョンなど)

●アプリケーションに関して
.NET Framework 4.5 C# で開発
サーバソケットオブジェクト TcpListenerから生成したTcpClient
サーバソケットオプションですがデフォルトから特に何も指定していません。次の通りTcpListenerインスタンスを作成しているだけです。
new TcpListener(new IPEndPoint(IPAddress.Any,5200))
ブロッキングソケットです。リードタイムアウトの例外をCatchして接続をクローズするようになっています。

クライアントソケットオブジェクト TcpClient

●実行WindowsOS環境
OS稼働時間 43613261秒≒約504日
OS 名: Microsoft Windows 7 Professional
OS バージョン: 6.1.7601 Service Pack 1 ビルド 7601
OS 製造元: Microsoft Corporation
OS 構成: スタンドアロン ワークステーション
OS ビルドの種類: Multiprocessor Free

WindowsUpdate状況

[01]: KB2849697 [02]: KB2849696 [03]: KB2841134 [04]: KB2841134 [05]: KB2670838 [06]: KB2830477 [07]: KB2592687 [08]: KB2479943 [09]: KB2491683 [10]: KB2503665 [11]: KB2506212 [12]: KB2506928 [13]: KB2509553 [14]: KB2510531 [15]: KB2511455 [16]: KB2515325 [17]: KB2532531 [18]: KB2533552 [19]: KB2533623 [20]: KB2534111 [21]: KB2536275 [22]: KB2536276 [23]: KB2544893 [24]: KB2545698 [25]: KB2547666 [26]: KB2552343 [27]: KB2560656 [28]: KB2563227 [29]: KB2564958 [30]: KB2570947 [31]: KB2574819 [32]: KB2579686 [33]: KB2585542 [34]: KB2604115 [35]: KB2619339 [36]: KB2620704 [37]: KB2621440 [38]: KB2631813 [39]: KB2639308 [40]: KB2640148 [41]: KB2644615 [42]: KB2647753 [43]: KB2653956 [44]: KB2654428 [45]: KB2655992 [46]: KB2656356 [47]: KB2660075 [48]: KB2667402 [49]: KB2676562 [50]: KB2685811 [51]: KB2685813 [52]: KB2685939 [53]: KB2690533 [54]: KB2698365 [55]: KB2705219 [56]: KB2709630 [57]: KB2712808 [58]: KB2718704 [59]: KB2719857 [60]: KB2726535 [61]: KB2727528 [62]: KB2729094 [63]: KB2729452 [64]: KB2731771 [65]: KB2732059 [66]: KB2732487 [67]: KB2732500 [68]: KB2736422 [69]: KB2742599 [70]: KB2743555 [71]: KB2750841 [72]: KB2758857 [73]: KB2761217 [74]: KB2763523 [75]: KB2770660 [76]: KB2773072 [77]: KB2785220 [78]: KB2786081 [79]: KB2789645 [80]: KB2798162 [81]: KB2799926 [82]: KB2800095 [83]: KB2803821 [84]: KB2807986 [85]: KB2808679 [86]: KB2813347 [87]: KB2813430 [88]: KB2820331 [89]: KB2832414 [90]: KB2834140 [91]: KB2836942 [92]: KB2836943 [93]: KB2839894 [94]: KB2840149 [95]: KB2840631 [96]: KB2843630 [97]: KB2846960 [98]: KB2847077 [99]: KB2847311 [100]: KB2847927 [101]: KB2852386 [102]: KB2853952 [103]: KB2855844 [104]: KB2857650 [105]: KB2859537 [106]: KB2861191 [107]: KB2861698 [108]: KB2862152 [109]: KB2862330 [110]: KB2862335 [111]: KB2862966 [112]: KB2862973 [113]: KB2864058 [114]: KB2864202 [115]: KB2868038 [116]: KB2868116 [117]: KB2868626 [118]: KB2871997 [119]: KB2882822 [120]: KB2884256 [121]: KB2887069 [122]: KB2888049 [123]: KB2891804 [124]: KB2892074 [125]: KB2893294 [126]: KB2893519 [127]: KB2894844 [128]: KB2900986 [129]: KB2908783 [130]: KB2909210 [131]: KB2911501 [132]: KB2912390 [133]: KB2913152 [134]: KB2918077 [135]: KB2918614 [136]: KB2919469 [137]: KB2922229 [138]: KB2923545 [139]: KB2926765 [140]: KB2928562 [141]: KB2929733 [142]: KB2929755 [143]: KB2931356 [144]: KB2937610 [145]: KB2939576 [146]: KB2943357 [147]: KB2957189 [148]: KB2957503 [149]: KB2957509 [150]: KB2961072 [151]: KB2965788 [152]: KB2966583 [153]: KB2968294 [154]: KB2970228 [155]: KB2971850 [156]: KB2972100 [157]: KB2972211 [158]: KB2972280 [159]: KB2973112 [160]: KB2973201 [161]: KB2973337 [162]: KB2973351 [163]: KB2976627 [164]: KB2976897 [165]: KB2977292 [166]: KB2977728 [167]: KB2978092 [168]: KB2978120 [169]: KB2978668 [170]: KB2978742 [171]: KB2979570 [172]: KB2980245 [173]: KB2984972 [174]: KB2984976 [175]: KB2984981 [176]: KB2985461 [177]: KB2987107 [178]: KB2991963 [179]: KB2992611 [180]: KB2993651 [181]: KB2993958 [182]: KB2994023 [183]: KB2998527 [184]: KB2999226 [185]: KB3000061 [186]: KB3000869 [187]: KB3000988 [188]: KB3001554 [189]: KB3002885 [190]: KB3003057 [191]: KB3003743 [192]: KB3005607 [193]: KB3006226 [194]: KB3008627 [195]: KB3010788 [196]: KB976902 [197]: KB982018

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

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

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

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

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

umyu

2018/04/11 10:53

1,インストールしているKBの部分が長いので、該当部分はコードタグで囲って頂けませんか2,リードタイムアウトを使っているとのことですが、ブロッキングソケットでしょうか? 3,サーバー側でnetstat -anp tcp を行い、TCPのステートを確認してくださいな。 導入できるならProcess Explorerの方が正確な情報が取れます。 4,サーバー側のソケットオプション(SO_EXCLUSIVEADDRUSE、SO_REUSEADDR)オプションの値はどう設定されていますか?
naitou

2018/04/12 00:32

1.変更しました。 2.ブロッキングソケットです。リードタイムアウトの例外をCatchして接続をクローズするようになっています。 3.netstat -anp tcpでtcpポート状態を確認していましたが、当該サーバポートはListenとなっておりました。TIME_WAITが大量に残っていることもありませんでした。 4.サーバソケットオプションですがデフォルトから特に何も指定していません。次の通りTcpListenerインスタンスを作成しているだけです。 new TcpListener(new IPEndPoint(IPAddress.Any,5200)) 特にご指摘頂いたオプションですが、 サーバソケット(TcpListenerインスタンス)のExclusiveAddressUseはfalseになっています。 ReuseAddressは(TcpListenerインスタンスでServer.GetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress)を実行すると0でした。 以上、よろしくお願い致します。
umyu

2018/04/12 04:52 編集

質問文の変更ありがとうございました。 ブロッキングソケット&ReadTimeout のアプリはほぼ作らないので、以下からは参考程度でお願いします。 1,まずwindowsに限定している話題なため、マルチポストを明言した上でmsdnフォーラムに投稿するのも一つの手かと。 その時はソースコードも記載してくださいな。 2,サーバー側のコード PINGフレームを定期的に送信してなさそうなので、 ノンブロッキング or 非同期ソケットにして、アプリケーション側でタイムアウトの実装(CancellationTokenが使えるかと)をする形が良いのではないでしょうか。 3,通信部分は変更できるならWebSocketかHttpListernerにするとデバック時の負荷が軽減されます。個人的にお力になれそうになさそうなので、申し訳ないです。
naitou

2018/04/12 07:53

アドバイスありがとうございました。処理方式の変更の際には参考にさせて頂きたいと思います。
guest

回答1

0

自己解決

KB2577795のWindowsOS不具合でした。

Windows7は修正プログラムにて対応可能、WindowsVistaは修正プログラムがない為、定期的な再起動で対応する必要があります。

https://support.microsoft.com/ja-jp/help/2577795/kernel-sockets-leak-on-a-multiprocessor-computer-that-is-running-windo

https://support.microsoft.com/ja-jp/help/2745079

投稿2019/09/09 10:30

naitou

総合スコア141

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問