如果连接列表很小,此代码可以正常工作,但如果我尝试连接到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);
}