C++ Builder XE4
TClientSocketを用いてTCP/IP通信をしているソフトがあり、それをWindows 7に対応させた。
Windows 7上では問題なく動作をする。一方で、同じソフトをWindows 8.1, Windows 10上で動作させた場合、ClientSocketDisconnect()イベントが発生するタイミングがある。
(互換モードでWindows 7を選択しても解消しなかった)。
対処方法
- TClientSocketをやめてIndyのAPI(TIdTCPClient)を使う
- ClientSocketDisconnect()が発生する条件を把握して対処する
方法2も興味があるが、対処したところで、他の部分で問題は残りそう。
関連 http://qiita.com/7of9/items/897eee6f09b6d37af499
関連 http://www.delphigeist.com/2010/03/indy-or-tclientsockettserversocket.html
Dorin Duminica, September 1, 2010 at 8:05 AM
I do NOT encourage third party components at anytime, yes TClientSocket/TServerSocket are pretty unstable, but Indy can do it's job also, once you get the hang of it...
Indy使用への変更点
TClientSocketをやめてIndyのAPI(TIdTCPClient)を使う
TIdTCPClient is not an asynchronous component. It does not tell you when data arrives.
TClientSocketではClientSocketRead()イベントでデータ受信時の処理をできたが、TIdTCPClientはそういうイベントがない。
IdTCPClient1.InputBuffer.Size
をチェックする処理が必要になる。
Indyに変更後
(追記 2017/02/14)
IndyのTCP/IP通信に変更したところ、同様の切断症状が見られた。
共通処理部分でWindows 8.1以降の特有の問題があるようだ。
結局、方法2の対処をすることになった。
Windows 10の設定を確認
Windows 10のネットワークアダプタの電力設定を変更してみた。
https://www.sevenforums.com/network-sharing/363165-lan-keeps-disconnecting-connecting-constantly.html
のスクリーンショットに見られる「Allow the computer to turn off this device to save power」に該当する設定をOFFにした。
切断される症状は解消しなかった。
別途、電力設定でWindows 7において設定している項目をWindows 10でも設定したが、症状は解消していない。
ソフトの設計ミス
http://qiita.com/7of9/items/bd75e5beb5fc59526882
に書いたように、設計ミスのようだった。
本来、定期的に動くべきところが、Windows 8.1/10になってから処理停止するようになっており、それが引き金となってTCP/IPが切断される状態になっていた。