【问题标题】:Socket Beginconnect several times for the same socket while not connectedSocket Beginconnect 在未连接时为同一个套接字连接多次
【发布时间】:2018-09-22 21:25:03
【问题描述】:
我正在尝试使用 c# 中的异步套接字将客户端连接到服务器。
我在做socket.beginconnect尝试连接,重点是如果连接没有建立,我想尝试beginconnect,如果500ms后连接没有建立,我想尝试再说一遍,比如说 10 次。
我尝试了一个简单的 bucle,但它不起作用,因为在前一个完成之前我无法再次开始连接,但是当 beginconnect 完成并且找不到服务器时,它返回一个没有服务器的 expecion。
【问题讨论】:
标签:
c#
visual-studio
sockets
client
【解决方案1】:
MSDN 文档说:
要取消对 BeginConnect 方法的挂起调用,请关闭 Socket。
当在异步操作中调用 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;
}