c# - 循环直到使用 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)(对象结果,
我对使用套接字还很陌生(而且我只编程了几个月)所以我确定我完全错误地解决了这个问题,所以我很感激任何帮助/建议。
解决方案
由于您尚未发布完整的代码,我假设您正在尝试使用全局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例子,看看吧。如果你修复,这是你方法的第一步,它应该可以工作。
推荐阅读
- java - 对数组列表进行排序时遇到问题
- java - 为什么使用 for 循环的倒数之和比流快 400 倍?
- excel - VBA - 根据列值删除行
- reactjs - 在 React 中获取 post 对象和 slug 以正确更新
- assembly - Mips 腐烂加密
- java - 如何使用 Spring Boot 在 Keycloak 中设置 redirect_uri
- python - Django:在 /admin 处不存在
- amazon-ec2 - 使用 Boto3 按实例 ID 获取 EC2 实例每月的总 NetworkOut 字节数
- sql - 如何在碧玉报告中打印带有“表达式时打印”的字段?
- python - 如何预测 scikit-learn 中未知函数的组件?