TCP/IPにて、10054のエラーが多発する問題
会社にて、散々いろんなコードを試してみましたが、結局原因は他にありました。
10054のソケットエラーとは、リモートホストからの切断を意味します。
さて、なぜ通信してるのにこんなものが起きるのか?
最初は、KeepAliveを疑ってました。
KeepAliveの間隔が短いため、サーバ側で処理実行中だと、切断されるのではないかと。
事実これは違いました。
ですが、setsockoptの説明を見ると、KeepAliveが失敗すると、10054を返すという記述はあるので、当たりをつけるための着眼点としては間違ってないはずです。
では、他に何があるんだろうと模索してましたが、最終的な原因は、以下のコードにありました。
shutdown(sock, SD_SEND);
ソケット破棄時に最初に送信ポートを閉じて、残りの受信バッファを取得する処理の部分です。
サーバ側のコードのチェックはしていませんが、こいつが悪さをしていたようです・・・
私の作成したコードは一連のパケットをサーバ側に送りつけ、サーバ側が処理をしている間、終了コードを待つというものを作ったのです。
そのため、送信完了後、終了処理に入るため、送信側ポートの切断を行い、残りの受信バッファを全て受信後、受信側ポートの切断も行って、ソケットを破棄しようとしていたのでした。
サーバ側コードは、MFCの非同期ソケットを使用しているため、送信側ポートを閉じようとした場合に、どうもコネクションを切断するイベントが発生している気がします。
私の中では、送信側のみ閉じたとしても、受信側がいきていれば、対象のデータは受信可能だと思っているのですが・・・
何か違うんでしょうか?
そもそも、TCP/IPレベルで、送信側ポート切断と受信側ポート切断って見分けつくんでしょうか?
なんか根本的にソケット通信処理周りの下調べが足りない気が・・・・
http://pub.ne.jp/tb.php/234834