2

Visual Studio 2008 C#.NET3.5アプリケーションをWindowsXPSP3x86で実行しています。私のアプリケーションには、OnSendTask複数のスレッドから同時に呼び出すことができるイベントハンドラーがあります。リモートホストへのTCP接続を開き、データを送受信します。

例えば:

/// <summary>
/// prevent us from exceeding the maximum number of half-open TCP 
/// connections in Windows XP.
/// </summary>
private System.Threading.Semaphore tcp_connection_lock_ = 
    new System.Threading.Semaphore(10, 10);

public event EventHandler<SendTaskEventArgs> SendTask;

private void OnSendTask(object sender, SendTaskEventArgs args)
{
    try
    {
        tcp_connection_lock_.WaitOne();
        using (TcpClient recipient = new TcpClient())
        {
            // error here!
            recipient.Connect(args.IPAddress, args.Port);
            using (NetworkStream stream = recipient.GetStream())
            {
                // read/write data
            }
    }
    catch
    {
        // write exceptions to the logfile
    }
    finally
    {
        tcp_connection_lock_.Release();
    }
}

void SendTasks(int tasks_to_send)
{
    using (ManualResetEvent done_event = new ManualResetEvent(false))
    {
        int countdown = tasks_to_send;
        for (int i = 0; i < tasks_to_send; ++i)
        {
            ThreadPool.QueueUserWorkItem((o) =>
            {
                SendTaskEventArgs args = new SendTaskEventArgs(/*...*/);

                EventHandler<SendTaskEventArgs> evt = SendTask;
                if (evt != null)
                    evt(this, e);

                if (Interlocked.Decrement(ref countdown) == 0)
                    done_event.Set();
            }, i);
        }
        done_event.WaitOne();
    }
}

残念ながら、私は時々このエラーを目にします:

System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 192.168.0.16:59596
at System.Net.Sockets.TcpClient.Connect(String hostname, Int32 port)

情報のいくつかのポイント:

  • 40台のリモコンにタスクを送信すると、6時頃からこの応答が表示されます。
  • Wiresharkトレースは、PCからリモートへのTCP接続を開始する試みさえ示していません。
  • PCからリモートにpingを実行して、一貫した良好な応答を得ることができます。
  • リモートはすべて、このアプリケーションを実行しているPCと同じスイッチとサブネット上にあります。邪魔になるような派手なネットワーキングはありません。

誰かがこのエラーを引き起こしている可能性があるもの、または私がそれを修正する方法を提案できますか?

ありがとう

4

1 に答える 1

3

最大ハーフオープンTCP接続の背後にあるすべての詳細はわかりませんが、アプリケーション接続に固有のものではなく、システム全体に固有のものであると思います。このエラーが発生したときに、TCP接続を作成している他のアプリケーションがシステム上にないことを確認しますか?

エラーが発生するたびに再試行を設定します。何かのようなもの:

private const int MaxRetries = 10;
private void OnSendTask(object sender, SendTaskEventArgs args)
{
    bool retry = false;
    try
    {
        tcp_connection_lock_.WaitOne();
        using (TcpClient recipient = new TcpClient())
        {
            // error here!
            recipient.Connect(args.IPAddress, args.Port);
            using (NetworkStream stream = recipient.GetStream())
            {
                // read/write data
            }
        }
    }
    catch (SocketException ex)
    {
        if(args.RetryCount < MaxRetries)
        {
            retry = true;
            args.RetryCount++;
        }
        else
        {
            // write exceptions to the logfile
        }
    }
    finally
    {
        tcp_connection_lock_.Release();
    }

    if(retry)
    {
        Thread.Sleep(1);
        OnSendTask(sender, args);
    }
}
于 2012-05-22T21:49:21.740 に答える