C# TCP连接尝试超时

C# TCP连接尝试超时,c#,tcp,C#,Tcp,在C#中,我尝试测试与以下端口的连接: Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(telco.Address, telco.Port); 当端口可用时,它工作得非常好。但是,如果端口不可用(例如TCP/81上的google.com),则需要很

在C#中,我尝试测试与以下端口的连接:

Socket socket = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp);

socket.Connect(telco.Address, telco.Port);
当端口可用时,它工作得非常好。但是,如果端口不可用(例如TCP/81上的google.com),则需要很长时间(约60秒)才能超时。这是一个状态页面,所以我想相对快速地失败


我试图将socket.SendTimeout和socket.ReceiveTimeout设置为5000ms(5秒),但似乎没有效果。

认为您正在查找socket.ReceiveTimeout()

或者使用beginConnect()并使用AutoResetEvent等同步工具捕捉超时


请参阅本文:

认为您正在寻找socket.ReceiveTimeout()

或者使用beginConnect()并使用AutoResetEvent等同步工具捕捉超时


请参阅本文:

要精确控制超时,请执行以下操作:

  • 用上面的代码启动一个线程
  • 触发线程并尝试套接字连接后,执行您需要的操作(即,您有一点时间做的事情,至少
    Application.DoEvents()
  • Thread.Sleep()
    指定所需的超时时间间隔。或者使用其他方法使时间流逝
  • 检查连接是否从主线程打开。可以通过观察成功连接后将设置的某些状态变量来完成此操作
  • 如果是,请使用连接。如果不是,请在等待的套接字上使用
    Socket.Close()
    ,以中断连接尝试
是的,您将在尝试连接的线程中得到异常,但是您可以安全地吞下它并假设一切正常


Socket.Close()

  • 用上面的代码启动一个线程
  • 触发线程并尝试套接字连接后,执行您需要的操作(即,您有一点时间做的事情,至少
    Application.DoEvents()
  • Thread.Sleep()
    指定所需的超时时间间隔。或者使用其他方法使时间流逝
  • 检查连接是否从主线程打开。可以通过观察成功连接后将设置的某些状态变量来完成此操作
  • 如果是,请使用连接。如果不是,请在等待的套接字上使用
    Socket.Close()
    ,以中断连接尝试
是的,您将在尝试连接的线程中得到异常,但是您可以安全地吞下它并假设一切正常


Socket.Close()

Socket socket = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp);

IAsyncResult result = socket.BeginConnect(telco.Address, telco.Port, null, null);

bool connectionSuccess = result.AsyncWaitHandle.WaitOne(5000, true);

为了保持简单性,我最终使用了类似的代码:

Socket socket = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp);

IAsyncResult result = socket.BeginConnect(telco.Address, telco.Port, null, null);

bool connectionSuccess = result.AsyncWaitHandle.WaitOne(5000, true);

我已经试过了。我也在原来的问题中加入了。谢谢。我也试过了。我也在原来的问题中加入了。谢谢。你可能需要一个变通方法。请看这个类似的问题:你可能需要一个变通方法。请看这个类似的问题:不要逃避线程,因为你很快或稍后会遇到它,因为你是异步执行操作。这是一个状态页面,它会检查一些TCP端口是否处于活动状态,以及它们是否从未执行过任何操作。我认为在这种情况下,逃离线程是正确的做法。不要逃离线程,因为你正在异步执行操作,很快或稍后会遇到它。这是一个状态页面页面中,它会检查一些TCP端口,以查看它们是否处于活动状态,并且从未对它们执行任何操作。我认为在这种情况下,逃离线程是正确的做法。