TcpClient.Connect函数连接超时的问题

问题原述:

http://topic.csdn.net/t/20060616/15/4825920.html

调用TcpClient.Connect函数连接其他机器。我在一台机器上测试程序,对于连接根本无法连接(物理连接不通)的机器,该函数用时5秒左右返回,并捕获SocketException异常。我在另一台机器上测试时,Connect函数用时26秒左右的时间才返回。请问有没有方法设置Connect函数连接超时的时间,如果超过一定时间还没有连上则返回。

解决方法:

写了个帮助类,用了线程池  
   
  class   TcpClientConnector  
  {  
          ///   <summary>  
          ///   在指定时间内尝试连接指定主机上的指定端口。  
          ///   </summary>  
          ///   <param   name="hostname">要连接到的远程主机的   DNS   名。</param>  
          ///   <param   name="port">要连接到的远程主机的端口号。</param>  
          ///   <param   name="millisecondsTimeout">要等待的毫秒数,或   -1   表示无限期等待。</param>  
          ///   <returns>已连接的一个   TcpClient   实例。</returns>  
          ///   <remarks>本方法可能抛出的异常与   TcpClient   的构造函数重载之一  
          ///   public   TcpClient(string,   int)   相同,并若指定的等待时间是个负数且不等于  
          ///   -1,将会抛出   ArgumentOutOfRangeException。</remarks>  
          public   static   TcpClient   Connect(string   hostname,   int   port,   int   millisecondsTimeout)  
          {  
                  ConnectorState   cs   =   new   ConnectorState();  
                  cs.Hostname   =   hostname;  
                  cs.Port   =   port;  
                  ThreadPool.QueueUserWorkItem(new   WaitCallback(ConnectThreaded),   cs);  
                  if   (cs.Completed.WaitOne(millisecondsTimeout,   false))  
                  {  
                          if   (cs.TcpClient   !=   null)   return   cs.TcpClient;  
                          throw   cs.Exception;  
                  }  
                  else  
                  {  
                          cs.Abort();  
                          throw   new   SocketException(11001);   //   cannot   connect  
                  }  
          }  
   
          private   static   void   ConnectThreaded(object   state)  
          {  
                  ConnectorState   cs   =   (ConnectorState)state;  
                  cs.Thread   =   Thread.CurrentThread;  
                  try  
                  {  
                          TcpClient   tc   =   new   TcpClient(cs.Hostname,   cs.Port);  
                          if   (cs.Aborted)  
                          {  
                                  try   {   tc.GetStream().Close();   }  
                                  catch   {   }  
                                  try   {   tc.Close();   }  
                                  catch   {   }  
                          }  
                          else  
                          {  
                                  cs.TcpClient   =   tc;  
                                  cs.Completed.Set();  
                          }  
                  }  
                  catch   (Exception   e)  
                  {  
                          cs.Exception   =   e;  
                          cs.Completed.Set();  
                  }  
          }  
   
          private   class   ConnectorState  
          {  
                  public   string   Hostname;  
                  public   int   Port;  
                  public   volatile   Thread   Thread;  
                  public   readonly   ManualResetEvent   Completed   =   new   ManualResetEvent(false);  
                  public   volatile   TcpClient   TcpClient;  
                  public   volatile   Exception   Exception;  
                  public   volatile   bool   Aborted;  
                  public   void   Abort()  
                  {  
                          if   (Aborted   !=   true)  
                          {  
                                  Aborted   =   true;  
                                  try   {   Thread.Abort();   }  
                                  catch   {   }  
                          }  
                  }  
          }  
  }  
   
  =================================  
  用法示例:  
   
  try  
  {  
          Console.WriteLine("Connecting   to   nonexistenthost...");  
          TcpClient   tc   =   TcpClientConnector.Connect("nonexistent",   80,   1000);  
          Console.WriteLine("Returned");  
          try   {   tc.GetStream().Close();   }  
          catch   {   }  
          try   {   tc.Close();   }  
          catch   {   }  
  }  
  catch   (Exception   e)  
  {  
          Console.WriteLine("Exception:   "   +   e.Message);  
  }

转载于:https://www.cnblogs.com/sql4me/archive/2009/04/29/1446080.html

TcpClient.Connect函数连接超时的问题(转载)相关推荐

  1. TCP解决connect函数的超时问题

    在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未完成;同时TCP的三路握手操作继续进行;在这之后,我们可以调 ...

  2. connect 连接超时

    原文地址:http://blog.csdn.net/codeheng/article/details/44625495 在使用TCP的connect连接服务器时,在默认情况下系统使用的是阻塞式sock ...

  3. TCP Connect 函数超时的问题

    TCP 客户端通过 connect 函数连接服务器时,若服务器此时不在线或者当前网络不正常,会在 connect 函数中阻塞(默认情况下系统使用阻塞式 socket),直到超时时间到达,而这个超时时间 ...

  4. MySQL连接问题【如何解决MySQL连接超时关闭】

    --MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...

  5. socket connec连接超时处理

    最近把win32下的网关服务转到linux平台时遇到connect连接超时问题,经过多方收集资料简单整理下方便以后查找 linux或者win32控制台程序中connect函数默认是阻塞的,成功则返回0 ...

  6. C语言socket connect()函数(初始化套接字上的连接)(未完)(如何测试socket是否已经断开,如何判断socket是否断开)

    参考文章:C网络编程socket之connect函数 需研究下这个函数超时多久才返回... 文章目录 项目中注释解释 man 2 文档解释 关于上面man 2 手册中所提到的connect()案例,在 ...

  7. bind()和connect()函数:绑定套接字并建立连接

    socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的 IP 地址和端口绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理. ...

  8. c#中connect函数_C#.NET 各种连接字符串

    1.C#连接连接Access 程序代码: using   System.Data; using   System.Data.OleDb; .. string   strConnection=" ...

  9. Failed connect to github-production-release-asset-2e65be.s3.amazonaws.com:443; 连接超时

    安装docker-machine的时候, 提示下载错误, 解决方式如下: 1. 错误提示 [root@localhost logs]# curl -L https://github.com/docke ...

最新文章

  1. 基于vue的公共looploading组件(vue循环加载--组件)
  2. 【正一专栏】俄罗斯世界杯来了——抽签概述
  3. 初学Java Web(4)——Servlet学习总结
  4. qbuttongroup如何都不选中_全程马拉松,半程马拉松该如何跑?很多人都不知道这些细节...
  5. java生产者实现kafka拦截器
  6. ubuntun 16.04 AttributeError: type object 'Callable' has no attribute '_abc_registry'
  7. 山寨一个ini文件的解析器
  8. 搜索推荐广告中的Position Bias:美团DPIN
  9. 机器学习之问题建模(一)
  10. Java或Web中解决所有路径问题
  11. 【ArcPy视频教程】基于 ArcGIS Pro 的 ArcPy 教程(录制中)
  12. mdui.js手机端侧边滑出导航菜单
  13. 具体数学_计算机科学基础(第2版)pdf
  14. 基于穿戴式智能化步态分析仪的步态分析
  15. 【Qt】无法定位程序输入点 于动态链接库
  16. 【雷达】毫米波雷达和激光雷达
  17. java excel 数组公式_Apache poi中的数组公式
  18. C#自定义控件添加至工具箱的方法
  19. DSP之定时器理论笔记
  20. 俩人同样写代码,我拿七千他咋五万八...

热门文章

  1. java学习(101):arraylist的遍历和增加
  2. Python List insert()方法
  3. Python基础入门_3条件语句和迭代循环
  4. Linux内核程序的编译:模块化编译
  5. 串口数据字节位的理解
  6. day02-java关键字
  7. 白话经典算法系列之一 冒泡排序的三种实现
  8. 亲和数 杭电2040
  9. 【转】WEB前端调优
  10. PHP 5.4 on CentOS/RHEL 7.0, 6.5 and 5.10 via Yum