【发布时间】:2019-01-14 06:56:30
【问题描述】:
我需要一种方法来尝试连接到服务器,直到它成功连接。我已经使用 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(IAsyncResult asyncResult) 在 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) 在 SocketLibrary.Client.TCPClient.ConnectCallback(IAsyncResult ar) 在 System.Net.LazyAsyncResult.Complete(IntPtr userToken) 在 System.Net.ContextAwareResult.CompleteCallback(对象状态)在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态)在 System.Net.ContextAwareResult.Complete(IntPtr userToken) 在 System.Net.LazyAsyncResult.ProtectedInvokeCallback(对象结果, IntPtr userToken) 在 System.Net.Sockets.Socket.ConnectCallback() 在 System.Net.Sockets.Socket.RegisteredWaitCallback(对象状态,布尔值 超时)在 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(对象 状态,布尔超时)
我尝试捕获 ArgumentException,但随后出现此错误(再次多次)
未处理的异常:System.NullReferenceException:对象引用 未设置为对象的实例。在 SocketLibrary.Client.TCPClient.ConnectCallback(IAsyncResult ar) 在 System.Net.LazyAsyncResult.Complete(IntPtr userToken) 在 System.Net.ContextAwareResult.CompleteCallback(对象状态)在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态)在 System.Net.ContextAwareResult.Complete(IntPtr userToken) 在 System.Net.LazyAsyncResult.ProtectedInvokeCallback(对象结果, IntPtr userToken) 在 System.Net.Sockets.Socket.ConnectCallback() 在 System.Net.Sockets.Socket.RegisteredWaitCallback(对象状态,布尔值 超时)在 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(对象 状态,布尔超时)
我对使用套接字还很陌生(而且我只编程了几个月)所以我确定我完全错误地解决了这个问题,所以我很感激任何帮助/建议。
【问题讨论】:
-
这很可能与服务器连接有关。尝试 ping 它或使用 telnet 看看您是否可以访问它。很可能
clientSocket通过套接字发送请求并等待响应,但从未得到响应,因此抛出异常 -
服务器在所有其他测试中都运行良好,只有当我尝试以这种方式连接时才会发生这种情况。但是,服务器确实说客户端连接了 10 次,然后立即断开连接。编辑:此外,它适用于 telnet。
标签: c# .net sockets asynchronous client