TcpClient.BeginConnect花费太多时间来完成错误的IP

时间:2014-03-19 11:51:58

标签: c# sockets asynchronous tcpclient

如果连接列表很小,此代码可以正常工作,但如果我尝试连接到20个不同的IP,其中许多是错误的IP,那么BeginConnect需要花费太多时间。例如,如果我有一个IP列表,前19个是错误的IP(这些连接应该失败,因为没有带有该IP的机器,或者因为我的服务器没有在具有该IP的机器上运行)和最后一个是正确的,连接需要很多秒,超过50秒。相反,如果第一个BeginConnect使用正确的IP完成,则连接建立得非常快。

foreach(string ip in ips)
{
     client = new TcpClient();
     client.BeginConnect(System.Net.IPAddress.Parse(ip), port, new AsyncCallback(ConnectCallback), client);
}

在connect回调中,如果建立连接,我启动BeginRead

private void ConnectCallback(IAsyncResult result)
{
        TcpClient client = (TcpClient)result.AsyncState;
        try
        {
            if (client != null && client.Client != null)
                client.EndConnect(result);                    
            else
                return;
        }
        catch
        {
            if (client != null && client.Client != null)
                client.Close();
            return;
        }

        if (client != null && client.Client != null)
        {
            NetworkStream networkStream = client.GetStream();
            byte[] buffer = new byte[client.ReceiveBufferSize];
            networkStream.BeginRead(buffer, 0, buffer.Length, ReadCallback, buffer);
        }
    }

使用waitOne选项未建立连接

            IAsyncResult asyncResult = client.BeginConnect(System.Net.IPAddress.Parse(ip), port, null, null);
            if ( asyncResult.AsyncWaitHandle.WaitOne(1000, false) )
            {                 
                client.EndConnect(asyncResult);
                NetworkStream networkStream = client.GetStream();
                byte[] buffer = new byte[client.ReceiveBufferSize];
                networkStream.BeginRead(buffer, 0, buffer.Length, ReadCallback, buffer);
            }

问题是由未分配给任何计算机的IP引起的。如果我使用任何这些IP调用BeginConnect,则会阻止所有连接,并且不会建立任何有效连接。 我在尝试连接之前解决了发送ping的问题。如果ping没有响应,我就不会开始与该IP连接。

            Ping ping = new Ping();
            PingReply reply = ping.Send(System.Net.IPAddress.Parse(ip));
            if (reply.Status == IPStatus.Success)
            {
               client = new TcpClient();
               client.BeginConnect(System.Net.IPAddress.Parse(ip), m_port, new AsyncCallback(ConnectCallback), client);
            }

0 个答案:

没有答案