【问题标题】:How to change timeout of BeginConnect如何更改 BeginConnect 的超时时间
【发布时间】:2013-06-27 11:17:56
【问题描述】:

考虑以下程序:

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

【问题讨论】:

标签: c# sockets timeout


【解决方案1】:

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

【讨论】:

  • 好吧,关键是没有这样的服务器,即我能想到的唯一错误就是超时。我想知道如何增加这个超时值。
  • 您尝试了 ConnectAsync 还是只尝试了 Connect?如果调用 connect,您是否在完成的事件中收到任何错误或异常?如果调用 ConnectAsync,可以在回调中检查 SocketAsyncEventArgs.SocketError。
  • 连接产生:Elapsed ms: 1012 No connection could be made because the target machine actively refused it 127.0.0.1:7000 因此操作在相同的时间后失败。似乎操作系统正在积极拒绝连接,因为还没有打开这样的端口。有没有办法配置套接字,使其永远重试,直到可以建立连接? (具有普通的操作系统/套接字功能,不使用线程)。
  • 所以你实际上遇到了我描述的问题(目标机器主动拒绝)。这意味着解决方案也是我所描述的解决方案。恐怕没有内置的方法可以实现您想要的。您必须将您的方法包装在 try catch 中(顺便说一下,我猜您没有异常,因为您没有调用 EndConnect)并创建一个新套接字并尝试再次连接并添加逻辑以检查次数或超时取决于你的需要。
  • 顺便说一句,我认为最好不要尝试重新连接。如果您从套接字层获得异常 - 超时不太可能有帮助。如果第一次尝试可能失败而其中一个失败 - 我建议您尝试重新连接 3 次。如果你需要永远重试(我有我的系统),那么你需要用重新连接做一个真正的循环,只是不要忘记在尝试重新连接之前引入超时。
猜你喜欢
  • 2015-03-25
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多