TCP连接尝试超时

时间:2011-11-04 22:14:37

标签: c# tcp

在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.RecieveTimeout设置为5000毫秒(5秒),但似乎没有效果。

3 个答案:

答案 0 :(得分:1)

我最终使用与此类似的代码来保持简洁性:

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);

答案 1 :(得分:0)

认为你正在寻找socket.ReceiveTimeout();

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

请参阅此帖子:How to configure socket connect timeout

答案 2 :(得分:0)

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

  • 使用上面的代码启动一个帖子
  • 线程被触发并尝试套接字连接后,做你需要的事情(即你有一点时间,至少Application.DoEvents()
  • Thread.Sleep()所需的超时间隔。或者使用其他方法让时间过去
  • 检查主线程是否已打开连接。您可以通过观察在成功建立连接后设置的某个状态变量来执行此操作。
  • 如果是,请使用连接。如果没有,请在等待的套接字上使用Socket.Close()来中断连接尝试。

是的,您将在尝试连接的线程中获得异常,但您可以安全地吞并它并假设一切正常。

http://msdn.microsoft.com/en-us/library/wahsac9k(v=VS.80).aspx Socket.Close()