2017-01-05 14 views
0

私は非同期呼び出しを使用してTCPクライアントを作成しています。アプリの起動時にサーバーがアクティブであれば、サーバーは接続して通話をOKにします。しかし、最初の接続が失敗した場合、それ以降のconnect()の呼び出しはすべてWSAENOTCONN(10057)で失敗し、ネットワークトラフィックは生成されません(Wiresharkでチェックされます)。TCPソケットの接続に失敗した後の正しい手順は何ですか?

現在、コードはエラーが発生したときにソケットを閉じません。 TCP状態図はそれを必要としていないようです。それは単に30秒間待ってからconnect()をもう一度試みます。

その後のconnect()と次のread()の両方がWSAENOTCONNエラーを返します。

ソケットを閉じて新しいソケットを開く必要がありますか?もしそうであれば、どのエラーが私にソケットを閉じる必要がありますか。エラーがたくさんあるので、テストベンチでは決して見られないものがあります。

これは実際にはInterval Zero RTX 2009ですが、これはMS Winsock2と見なすことができますが、場所によって若干異なります。

+0

'WSAENOTCONN'は、' connect() 'の文書化されたエラーコードではありません。 –

答えて

0

ソケットを閉じて新しいソケットを開く必要がありますか?

はい。

あなたは(セイ、ピアは閉じられているような接続)の利益のために行って、接続になり、すべてのエラー条件の下でソケットを閉じる必要があります

+0

接続を閉じるピアがエラーではありません。 – EJP

+0

@EJP:いいえ、接続はまだ消えており、ソケットはまだ閉じておく必要があります。 –

1

私はソケットを閉じて、新しいものを開く必要がありますか?

はい。エラーが、私はおそらく、テストベンチ上で見ることはありませんいくつかは異なるエラーがたくさんあるので、ソケットを閉じるために私を必要と

もしそうなら、。

ほとんどすべてのエラーは接続にとって致命的なものであり、ソケットを閉じることになります。 EAGAIN/EWOULDBLOCKはEINTRのように顕著な例外ですが、私は他のものをオフラインに考えることはできません。

+0

EINVALは接続にもEBADFにも致命的ではありませんが、どちらの場合でもプログラムがソフトウェアバグを示しているため、ほぼ確実に続行できません。 – EJP

+0

Winsockの[documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737625.aspx)によると: "返されたエラーコードが接続の試行に失敗したことを示す場合(つまり、WSAECONNREFUSED 、WSAENETUNREACH、WSAETIMEDOUT)**アプリケーションは、同じソケット**に対して再度接続を呼び出すことができます**。 "私はそれに頼ることはありません。 **接続関連**エラーが発生した場合は、ソケットを閉じて再作成することをお勧めします。 @RemyLebeau合意した。 –

+0

それはBSDやLinuxの実装ではBSDソケットでは動作しないWinsock-ismです。 – EJP

関連する問題