C# 如何更改BeginConnect的超时

C# 如何更改BeginConnect的超时,c#,sockets,timeout,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, Pr

考虑以下计划:

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
中获取错误,可以在那里查看失败的原因。如果要主动尝试重新连接,则必须实现自己的逻辑,该逻辑将检查结果,并在需要时在一段时间内创建一个新套接字,然后再次尝试连接。

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

请查看此[thread][1][1]:请查看此[thread][1][1]:重点是没有这样的服务器,也就是说,我能想到的唯一错误就是超时。我想知道如何增加这个超时值。您是尝试了ConnectAsync还是只是连接?在调用connect时,是否在已完成事件中出现任何错误或异常?如果调用ConnectAsync,可以在回调中检查SocketAsyncEventArgs.SocketError。Connect产生:
已用ms:1012无法建立连接,因为目标计算机主动拒绝了它127.0.0.1:7000
,因此操作在相同的时间后失败。似乎操作系统正在主动拒绝连接,因为还没有打开这样的端口。是否有办法配置套接字,使其在建立连接之前永远重试?(使用普通OS/socket函数,不使用线程)。因此,您实际上遇到了我描述的问题(目标机器主动拒绝)。这意味着解决方案也是我所描述的。恐怕没有内在的方法来实现你想要的。你必须用try-catch包装你的方法(顺便说一句,我想你没有异常,因为你没有调用EndConnect),然后创建一个新的套接字并尝试再次连接,并根据需要添加逻辑来检查次数或超时。顺便说一句,我想最好不要尝试重新连接。若您从套接字层得到一个异常,那个么超时不太可能有帮助。如果第一次尝试失败,而随后的一次尝试失败,我建议您尝试重新连接3次,例如。如果你需要永远重试(我把它放在我的系统上),那么你需要用reconnect做一个while true循环,只是不要忘记在尝试重新连接之前引入超时。重点是没有这样的服务器,也就是说,我能想到的唯一错误就是超时。我想知道如何增加这个超时值。您是尝试了ConnectAsync还是只是连接?在调用connect时,是否在已完成事件中出现任何错误或异常?如果调用ConnectAsync,可以在回调中检查SocketAsyncEventArgs.SocketError。Connect产生:
已用ms:1012无法建立连接,因为目标计算机主动拒绝了它127.0.0.1:7000
,因此操作在相同的时间后失败。似乎操作系统正在主动拒绝连接,因为还没有打开这样的端口。是否有办法配置套接字,使其在建立连接之前永远重试?(使用普通OS/socket函数,不使用线程)。因此,您实际上遇到了我描述的问题(目标机器主动拒绝)。这意味着解决方案也是我所描述的。恐怕没有内在的方法来实现你想要的。你必须用try-catch包装你的方法(顺便说一句,我想你没有异常,因为你没有调用EndConnect),然后创建一个新的套接字并尝试再次连接,并根据需要添加逻辑来检查次数或超时。顺便说一句,我想最好不要尝试重新连接。若您从套接字层得到一个异常,那个么超时不太可能有帮助。如果第一次尝试失败,而随后的一次尝试失败,我建议您尝试重新连接3次,例如。如果您需要永远重试(我的系统就是这样),那么您需要使用reconnect执行一个while true循环,只是在尝试重新连接之前不要忘记引入超时。