首页 > 解决方案 > 循环直到使用 BeginConnect 连接到服务器(C# 套接字)

问题描述

我需要一种方法来尝试连接到服务器,直到它成功连接。我已经使用 Socket.Connect 成功地完成了,但我无法让它与 Socket.BeginConnect 一起使用。

这是方法:

public void Start()
{
    while (clientSocket == null || !clientSocket.Connected)
    {
        try
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.BeginConnect(serverEndPoint, new AsyncCallback(ConnectCallback), null);
        }
        catch (SocketException)
        {
            clientSocket.Close();
            Start();
        }
        catch (Exception) { throw; } 
    }
}

private void ConnectCallback(IAsyncResult ar)
{
    try
    {
        clientSocket.EndConnect(ar);
        clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
    }
    catch (Exception) { throw; }
}

但我收到此错误(多次):

System.ArgumentException:IAsyncResult 对象未从此类的相应异步方法返回。参数名称:System.Net.Sockets.Socket.InternalEndConnect 处的 asyncResult(IAsyncResult asyncResult) 处 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) 处 SocketLibrary.Client.TCPClient.ConnectCallback(IAsyncResult ar) 处 System.Net.LazyAsyncResult .Complete(IntPtr userToken) at System.Net.ContextAwareResult.CompleteCallback(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext ,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext。

我尝试捕获 ArgumentException,但随后出现此错误(再次多次)

未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。在 SocketLibrary.Client.TCPClient.ConnectCallback(IAsyncResult ar) 在 System.Net.LazyAsyncResult.Complete(IntPtr userToken) 在 System.Net.ContextAwareResult.CompleteCallback(Object state) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback , System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 的 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) System.Net.LazyAsyncResult.ProtectedInvokeCallback 上的 .ContextAwareResult.Complete(IntPtr userToken)(对象结果,

我对使用套接字还很陌生(而且我只编程了几个月)所以我确定我完全错误地解决了这个问题,所以我很感激任何帮助/建议。

标签: c#.netsocketsasynchronousclient

解决方案


由于您尚未发布完整的代码,我假设您正在尝试使用全局client对象。在 中ConnectCallback,您需要首先检索client对象并将其类型转换为Socket. 因此,在您的情况下,它将是:

private static void ConnectCallback(IAsyncResult ar) 
{  
    try 
    {  
        // Retrieve the socket from the state object.  
        client = (Socket) ar.AsyncState;
        //In case, you are using local client object
        //Socket client = (Socket) ar.AsyncState;

        // Complete the connection.  
        client.EndConnect(ar);  

        Console.WriteLine("Socket connected to {0}",  
            client.RemoteEndPoint.ToString());  

        // Signal that the connection has been made.  
        connectDone.Set();  
    } catch (Exception e) 
    {  
        Console.WriteLine(e.ToString());  
    }  
}  

上面的代码取自这个 MSDN例子,看看吧。如果你修复,这是你方法的第一步,它应该可以工作。


推荐阅读