我选择不使用异步调用,因为它需要回调,我只是好奇是否有办法通过使用类似 Unix 的非阻塞套接字方法来解决这个问题:Poll(),因为 Asyn 是专门为 Windows 环境创建的. 我正在研究这是否可以在没有异步的情况下完成。
需要注意的是:非阻塞!=异步:)
因此,我通过关闭 socket & Poll() 方法的阻塞标志有以下方法:
try
{
IPEndPoint hostEp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);
Socket hostSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
hostSock.Blocking = false;
hostSock.Connect(hostEp);
}
catch (Win32Exception se)
{
if (ex.ErrorCode == 10035) // WSAEWOULDBLOCK is expected, means connect is in progress
while (true)
{
Console.WriteLine("Connecting in progress");
bool connected = hostSock.Poll(1000000, SelectMode.SelectWrite);
if (connected)
{
Console.WriteLine("Connected");
break;
}
}
}
但是然后 SelectMode.SelectWrite 似乎并没有为我重新启动连接尝试。所以有什么问题?我怎么能解决这个问题?我应该使用Select() 而不是 Poll() 吗?