2017-01-22 57 views
0

我试图用c#中的异步套接字将客户端连接到服务器。套接字在未连接的情况下为同一个套接字开始连接

我在做socket.beginconnect尝试连接,重点是如果连接没有建立,我想它尝试开始连接,并且如果连接没有在500ms建立,我想让我们再试试10次。

我尝试了一个简单的bucle,但它不起作用,因为我无法再次beginconnect,直到前一个完成,但是当beginconnect完成并且没有找到服务器时,它返回一个没有服务器的expecion。

回答

1

MSDN文件说:

取消挂起的调用BeginConnect方法,关闭套接字。 当异步操作处于 进度中时调用Close方法时,将调用提供给BeginConnect方法的回调。 对EndConnect方法的后续调用将抛出 ObjectDisposedException来指示操作已取消 。

所以,你必须每次创建一个新的Socket:

public Socket TryConnect(...) 
{ 
    Socket socket; 

    try 
    { 
     socket = new Socket(...); 
     var connect = Task.Factory.FromAsync(
      socket.BeginConnect, socket.EndConnect, host, port, null); 

     var isConnected = connect.Wait(TimeSpan.FromSeconds(0.5)); 

     if (!isConnected) 
     { 
      socket.Close(); 
      return null; 
     } 

     return socket;  
    } 
    catch 
    { 
     if (socket != null) 
     { 
      socket.Dispose(); 
     } 
     throw; 
    } 
} 


for (var i = 0; i < 10; i++) 
{ 
    var socket = TryConnect(); 
    if (socket != null) 
     return socket; 
}