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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Programming MS Office 2000 Web Components第二章第一节(第二部分)

排序和过滤 阅读本节时&#xff0c;如果您打开随书光盘Samples\Chap02目录下的SortFilterExample.htm文件。您会发现这个例子很有用。本节展示的代码和描述的特定环境来自这个文件。 电子表格组件支持Excel中的基础的排序和过滤功能&#xff0c;并且通过编程模型和用户界面来提…

309. Best Time to Buy and Sell Stock with Cooldown

1 题目理解 Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple tim…

第一百一十二期:96秒100亿!如何抗住双11高并发流量?

今年双 11 全民购物狂欢节进入第十一个年头&#xff0c;1 分 36 秒&#xff0c;交易额冲到 100 亿 !比 2018 年快了近 30 秒&#xff0c;比 2017 年快了近 1 分半!这个速度再次刷新天猫双 11 成交总额破 100 亿的纪录。 作者&#xff1a;邴越 今年双 11 全民购物狂欢节进入第…

不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

Python爬虫为什么受欢迎如果你仔细观察&#xff0c;就不难发现&#xff0c;懂爬虫、学习爬虫的人越来越多&#xff0c;一方面&#xff0c;互联网可以获取的数据越来越多&#xff0c;另一方面&#xff0c;像 Python这样的编程语言提供越来越多的优秀工具&#xff0c;让爬虫变得简…

股票

FXCM - 网路外汇交易 http://www.fxcmasia.com/chinese/转载于:https://www.cnblogs.com/snowball/archive/2006/06/26/436446.html

740. Delete and Earn

1 题目 Given an array nums of integers, you can perform operations on the array. In each operation, you pick any nums[i] and delete it to earn nums[i] points. After, you must delete every element equal to nums[i] - 1 or nums[i] 1. You start with 0 poin…

第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?

区块链技术仍然在发展初期&#xff0c;实践应用也停留在试水阶段。就金融等领域而言&#xff0c;区块链究竟意味着什么?今后实践应用的前景何在?在Libra的倒逼下&#xff0c;全球央行数字货币又将如何发展? 作者&#xff1a;第一财经 两周前&#xff0c;区块链成为热词。上…

两种战斗

两种战斗 Written by Allen Lee 战斗分两种&#xff0c;我们一定要把它们分开&#xff0c;就是为了维持生命的战斗&#xff0c;和为了维持自尊的战斗。 如果你无法分清的话&#xff0c;要么你将致使他失去生命。要么你将致使他失去自尊。“你要是现在去帮忙的话&#xff0c;或…

地图图元的闪烁效果制作

实现查找之后如果加上一个闪烁效果会更明显&#xff0c;方法是用个时间控件控制&#xff0c;改变vstyle即可&#xff1b;还可以简单的设置进程休眠时间&#xff0c;改变可视性&#xff0c;利用一个循环&#xff0c;控制闪烁次数。前面一种实现代码如下&#xff1a; 用个时间控件…

790. Domino and Tromino Tiling

文章目录1 题目理解2 动态规划2.1只有一种板2.2 有两种板1 题目理解 We have two types of tiles: a 2x1 domino shape, and an “L” tromino shape. These shapes may be rotated. XX <- domino XX <- “L” tromino X Given N, how many ways are there to tile a …

第一百一十四期:盘点十大最新Web UI测试工具

本文为您盘点目前十大最新Web UI测试工具的各自优缺点&#xff0c;以方便您根据实际情况进行选择。 作者&#xff1a;陈峻 在过去的几年中&#xff0c;业界至少出现了十二种全新的UI测试自动化工具。虽然每一种工具都有各自的侧重点&#xff0c;但是它们普遍将出色的可用性和…

新起点

还记得以前找资料时经常看到博客园的文章&#xff0c;今天很高兴我也参与其中了。我只希望通过这么一个平台来不断的激励自己&#xff0c;属于我的大学时间已经不多了&#xff0c;不再懊悔过去&#xff0c;只要坚持从今天开始&#xff0c;一万小时定律我相信你。加油~ just now…

通过Web Services上传和下载图片文件

通过Web Services上传和下载图片文件 随着Internet技术的发展和跨平台需求的日益增加&#xff0c;Web Services的应用越来越广&#xff0c;我们不但需要通过Web Services传递字符串信息&#xff0c;而且需要传递二进制文件信息。下面&#xff0c;我就分别介绍如何通过Web Servi…

300. Longest Increasing Subsequence

文章目录1 题目理解2 动态规划3 二分贪心1 题目理解 Given an integer array nums, return the length of the longest strictly increasing subsequence. A subsequence is a sequence that can be derived from an array by deleting some or no elements without changing…

第一百一十五期:Web开发必须掌握的三个技术:Token、Cookie、Session

在Web应用中&#xff0c;HTTP请求是无状态的。即&#xff1a;用户第一次发起请求&#xff0c;与服务器建立连接并登录成功后&#xff0c;为了避免每次打开一个页面都需要登录一下&#xff0c;就出现了cookie&#xff0c;Session。 作者&#xff1a;一颗小梪梪 在Web应用中&am…

这个博客复活了

原来因为页面配置的问题出了一堆的bug,久而久之就不想管了。 但是经过了漫长的寻找博客的过程中&#xff0c;我还是回到了这里。 洛谷博客实在是有点太简陋了&#xff0c;\(hexo github\)上传太麻烦&#xff0c;要clean然后g,然后d。 之后我就重新弄了下界面&#xff0c; 现在…

第一百一十六期:不能错过!你必须知道的3种重要Python技能

学习Pandas是很棒的体验&#xff0c;学习Numpy也很有趣。但是&#xff0c;你是否过早地开始使用程序库了呢&#xff1f;这也许是因为你还没有意识到pure python的魅力。 作者&#xff1a;读芯术 学习Pandas是很棒的体验&#xff0c;学习Numpy也很有趣。但是&#xff0c;你是否…

Erlang消息传递-tut15.erl

作 w3cschool erlang 的练习 --------- 1 -module(tut15).2 3 -export([start/0, ping/2, pong/0]).4 5 %% Erlang 消息传递6 %% Erlang 进程之间的消息可以是任何简单的 Erlang 项. 比如说, 可以是列表、元组、整数、原子、进程标识等等7 %% recevie 关键字的语法: 请注意, 在…

673. Number of Longest Increasing Subsequence

文章目录1 题目理解2 动态规划1 题目理解 Given an integer array nums, return the number of longest increasing subsequences. Notice that the sequence has to be strictly increasing. 输入&#xff1a;整数数组int[] nums 输出&#xff1a;最长递增子序列的个数 规则&…

第一百一十七期:爱上 Go 语言的10个理由

这个月 Go 语言就将迎来它的10岁生日了&#xff0c;于是我们特地列出了10条让你可以开心使用 Go 语言的理由。 作者&#xff1a;4bytes 这个月 Go 语言就将迎来它的10岁生日了&#xff0c;于是我们特地列出了10条让你可以开心使用 Go 语言的理由。 Map 集合/映射默认使用0值 …