考虑以下程序:
using System;
using System.Diagnostics;
using System.Net.Sockets;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Socket sock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
try
{
Stopwatch watch = new Stopwatch();
watch.Start();
IAsyncResult res = sock.BeginConnect("localhost", 7000, null, null);
res.AsyncWaitHandle.WaitOne( 5000 ); // 5 sec timeout
watch.Stop();
Console.WriteLine("Elapsed ms: " + watch.ElapsedMilliseconds);
if (!sock.Connected) {
sock.Close();
Console.WriteLine("Failed to connect server.");
}
}
catch (System.Exception ex) {
Console.WriteLine(ex.Message);
}
}
}
}
控制台输出:
Elapsed ms: 1014
Failed to connect server.
我本来希望BeginConnect
尝试建立连接大约5秒,而等待总是在1秒后返回。为什么?
套接字不会尝试自行重新建立连接。到目前为止所做的操作意味着,如果套接字仍处于连接阶段,则将关闭套接字。但是,例如,如果服务器主动拒绝连接或类似的事情,你的套接字很快就会知道。要检查这一点,你需要从IAsyncResult
中获取错误,你可以看到它失败的原因。如果你想主动尝试重新连接,那么你必须实现自己的逻辑,该逻辑将检查结果,并在一段时间内创建一个新的套接字(如果需要),然后尝试再次连接。