私はC++でRTSPソースフィルターを開発しており、WINSOCK2.0-ブロッキングソケットを使用しています。
ブロッキングソケットを作成するときは、次のSO_RCVTIMEO
ように3秒に設定します。
int ReceiveTimeout = 3000;
int e = setsockopt(Socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&ReceiveTimeout, sizeof(int));
フィルタが接続しようとしIP_ADDRESS:554
ます(554はRTSPサーバーポートです)。ポート554でそのIPをリッスンしているサーバーがある場合、すべてうまくいきますが、次のようになります。
私のフィルターが既存のIPアドレスへのソケットを作成するが、誰もリッスンしていないランダムなポートで、
connect()
3秒間待機し、を返す場合WSAETIMEDOUT
。したがって、3秒後、提供されたURLが不正であることがわかります。フィルタが存在しないIPアドレスへのソケットを作成し、それを接続しようとすると、SOCKET_ERRORを返す前に約10秒間ハングします。したがって、
SO_RCVTIMEO
IPがネットワーク上に存在しない場合は無視されます...
質問: 2番目のケースでは、存在しないIPのタイムアウトを設定するにはどうすればよいですか?IPが存在するかどうかを確認するために最初にICMPPINGを送信する必要がありますか、それともそのような他のチェックを実行する必要がありますか?
どんな助けでもありがたいです。ありがとう。:)
私の問題への答え
私はブロッキングソケットを使用しているのでconnect()
、接続が確立されるまで、またはホストが応答していないか、接続を拒否しているために接続が失敗するまで、ブロックを呼び出します。ソケットのタイムアウトを3秒に設定し、存在しないホストに接続しようとすると、PC(クライアント)はSYN
フラグが設定されたTCPパケットを送信して、スリーウェイハンドシェイクを開始します。通常、ホストは、起動している場合、フラグが設定されたTCPパケットで応答しACK
、SYN
クライアント(me)はACK
フラグが設定されたTCPパケットを送信します。次に、接続が確立されます。ただし、ホストがダウンしてSYN
送信された場合、クライアントは3秒のタイムアウトが期限切れになるまで待機してから、TcpMaxConnectRetransmissions
(MICROSOFT ARTICLE)ホストは稼働している可能性がありますが、パケットが失われる可能性があるため、レジストリ設定に到達しますSYN
...私のWindows XPではこの設定が4になっていると思います。したがって、送信を試みるたびにSYN
3秒待機し、4番目のときはtryは失敗し、SOCKET_ERROR
(12秒後に)戻りWSAETIMEDOUT
、最後のWSAエラーとして設定されます。
connect()
これを回避する方法は、非ブロッキングソケットを使用し、Martin Jamesが提案したように、接続試行時間を手動で測定しようとすることです(現在はブロックされないため)。
もう1つの方法は、レジストリをいじることです。これが最後の手段です...