如何更改BeginConnect的超时

时间:2013-06-27 11:17:56

标签: c# sockets timeout

考虑以下计划:

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秒后返回。 为什么呢?

1 个答案:

答案 0 :(得分:1)

套接字不会尝试自行重新建立连接。到目前为止,您所做的将意味着如果它仍处于连接阶段,您将关闭套接字。但是,如果服务器主动拒绝连接或类似的东西,你的套接字将很快知道它。要检查是否需要从IAsyncResult获取错误,您可以看到它为什么失败。如果你想主动尝试重新连接,那么你必须实现自己的逻辑,检查结果并在一段时间内根据需要创建一个新的套接字并尝试再次连接。