ホームページ >バックエンド開発 >C++ >切断された IP アドレスに接続するときにソケット接続タイムアウトを短縮するにはどうすればよいですか?

切断された IP アドレスに接続するときにソケット接続タイムアウトを短縮するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-10 11:17:41490ブラウズ

How to Reduce Socket Connect Timeout When Connecting to a Disconnected IP Address?

ソケット接続タイムアウトの削減

問題: ソケット経由で到達不能な IP アドレスに接続すると、非常に長いタイムアウト (例: 15 秒) が発生することがよくあります。この記事では、この遅延を短縮する方法を説明します。

元のコード:

<code class="language-csharp">try
{
    m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    IPAddress ip = IPAddress.Parse(serverIp);
    int iPortNo = System.Convert.ToInt16(serverPort);
    IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
    m_clientSocket.Connect(ipEnd);
    if (m_clientSocket.Connected)
    {
        lb_connectStatus.Text = "Connection Established";
        WaitForServerData();
    }
}
catch (SocketException se)
{
    lb_connectStatus.Text = "Connection Failed";
    MessageBox.Show(se.Message);
}</code>

改善された解決策: BeginConnect メソッドと EndConnect メソッドにより、タイムアウト動作をより詳細に制御できます。 BeginConnect では、タイムアウト期間を指定できます。

<code class="language-csharp">Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// Set connection timeout (5 seconds)
IAsyncResult result = socket.BeginConnect(sIP, iPort, null, null);

bool success = result.AsyncWaitHandle.WaitOne(5000, true); // 5000 milliseconds = 5 seconds

if (socket.Connected)
{
    socket.EndConnect(result);
    // ... proceed with connection ...
}
else
{
    // Crucial: Close the socket to release resources
    socket.Close();
    throw new ApplicationException("Failed to connect to server.");
}</code>

この改訂されたコードは、5 秒のタイムアウトで接続を試みます。その時間枠内に接続が失敗した場合、例外がスローされ、ソケットは明示的に閉じられます。 これにより、リソースのリークが防止され、応答性が向上します。

以上が切断された IP アドレスに接続するときにソケット接続タイムアウトを短縮するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。