在使用C#中用TCP连接去扫描IP的过程中,发现,TCP连接没有可以设置连接超时的方法,如果扫描到空的IP或连接失败,那要等20多秒,甚至更长,
我们可以重新去用Thread的join这个带参数的线程,来解决这个问题,下面的这个类就是但连接超时参数的TCPCliento类
the TcpClientWithTimeout.cs class:

using System;
using System.Net.Sockets;
using System.Threading;/// <summary>
/// TcpClientWithTimeout 用来设置一个带连接超时功能的类
/// 使用者可以设置毫秒级的等待超时时间 (1000=1second)
/// 例如:
/// TcpClient connection = new TcpClientWithTimeout('127.0.0.1',80,1000).Connect();
///iP,端口,超时时间
/// </summary>
public class TcpClientWithTimeout
{protected string _hostname;protected int _port;protected int _timeout_milliseconds;protected TcpClient connection;protected bool connected;protected Exception exception;public TcpClientWithTimeout(string hostname,int port,int timeout_milliseconds){_hostname = hostname;_port = port;_timeout_milliseconds = timeout_milliseconds;}public TcpClient Connect(){//创建一个线程去做TCP连接connected = false;exception = null;Thread thread = new Thread(new ThreadStart(BeginConnect));thread.IsBackground = true; // 作为后台线程处理// 不会占用机器太长的时间thread.Start();// 等待如下的时间,JOIN阻塞线程一个等待时间,,阻塞后,如果连接成功,则返回这个connect对象,如果连接是失败的,结束这个tcp连接的线程,这里是关键,这样就实现了一个带有超时功能 的TCP连接类thread.Join(_timeout_milliseconds);if (connected == true){// 如果成功就返回TcpClient对象thread.Abort();return connection;}if (exception != null){// 如果失败就抛出错误thread.Abort();throw exception;}else{// 同样地抛出错误thread.Abort();string message = string.Format("TcpClient connection to {0}:{1} timed out",_hostname, _port);throw new TimeoutException(message);}}protected void BeginConnect(){try{connection = new TcpClient(_hostname, _port);// 标记成功,返回调用者connected = true;}catch (Exception ex){// 标记失败exception = ex;}}
}下面的这个例子就是如何利用5秒的超时,去连接一个网站发送10字节的数据,并且接收10字节的数据。// 设置一个带有5秒超时的tcp连接
TcpClient connection = new TcpClientWithTimeout("www.google.com", 80, 5000).Connect();
NetworkStream stream = connection.GetStream();// 发送10字节
byte[] to_send = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xa};
stream.Write(to_send, 0, to_send.Length);//接收10字节
byte[] readbuf = new byte[10]; // you must allocate space first
stream.ReadTimeout = 10000; // 10 second timeout on the read
stream.Read(readbuf, 0, 10); // read// 关闭连接
stream.Close();      // workaround for a .net bug: http://support.microsoft.com/kb/821625
connection.Close();

C# 中使用TCP连接设置超时问题相关推荐

  1. Linux网络协议栈:Linux 中每个 TCP 连接最少占用多少内存?

    Linux 中每个 TCP 连接最少占用多少内存? https://zhuanlan.zhihu.com/p/25241630 因为原文作者明确说明,不可转载,这里我只给出链接,仅供参考.

  2. linux命令查看tcp连接,查看linux系统中的TCP连接

    查看Linux的TCP连接 netstat -na    查看哪些IP连接本机 netstat -na Active Internet connections (servers and establi ...

  3. Linux系统tcp连接设置

    目录 net.ipv4.tcp_syn_retries net.ipv4.ip_local_port_range net.core.somaxconn net.ipv4.tcp_max_syn_bac ...

  4. tcp 连接,黑洞,超时

    1. lvs 建立在 tcp 之上,  先通过某个 port 建立了连接, 然后通过 seesion 转发给 realServer. tcp本身连接建立了,维护链接的定时器是keepalive,这个不 ...

  5. php alarm,php中pcntl_alarm为函数设置超时限制

    原理是在函数执行前先设定一个时钟信号,如果函数的执行超过规定时间,信号会被触发,信号处理函数(sig)会抛出一个异常,被外层代码捕获.这样就跳出了原来函数的执行,接着执行下面的代码.如果函数在规定的时 ...

  6. Nginx笔记-反向代理中配置WebSocket及设置超时

    这里贴下配置: ... server{listen 8888;server_name MyWeb;location / {proxy_pass http://xxx.xx.xx.xxx:xxxx;}l ...

  7. TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接

    一.TCP连接的ISN         之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...

  8. 三次握手和四次挥手图解_详解 TCP 连接的“三次握手”与“四次挥手”

    作者 | AhuntSun 责编 | Elle TCP connection 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西: 由于TCP不存在连接的概念 ...

  9. 详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”

    作者 |  AhuntSun 责编 | Elle TCP connection 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西: 由于TCP不存在连接的概 ...

最新文章

  1. “Attention is All You Need 翻译
  2. 浅析校园安防视频监控设备发展趋势
  3. 进制转换与ascll码利用
  4. 以后所有内容均以摘要方式发布
  5. 那些你踩过的币圈投资陷阱(下)
  6. linux系统调用理解之摘录(1)
  7. MySQL自动备份到本地数据库_MYSQL数据库自动本地/异地双备份/MYSQL增量备份
  8. Java中几种常量池的区分
  9. linux主频限制服务,linux抵御DDOS攻击 通过iptables限制TCP连接和频率
  10. java生成动态验证码_java动态生成验证码
  11. oracle 对象类型是什么意思,Oracle-对象类型
  12. 【没有assembly目录】spark2.0.0启动时无法访问spark-assembly-*.jar的解决办法
  13. 自学考试应该怎样答题才能更高分?
  14. StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction(ECCV 2018)
  15. 不忘初心,不负韶华,17款迈巴赫S400升级20款迈巴赫S680包围
  16. mac 取消 “Ctrl+空格“切换输入法
  17. 网页设计-公用导航栏
  18. 张瑞驰作文分享《蚕的自述》
  19. 爬取《你好,李焕英》影评,并生成词云图
  20. div css sprites精灵-CSS图像拼合 CSS贴图定位网页背景素材图片拼合定位布局技术教程

热门文章

  1. Html5游戏开发攻略(API篇)
  2. SAP 移动类型 与 账户 字段选择不一致
  3. 综合布线方案设计模版
  4. 在xp系统电脑上建立宽带连接服务器吗,windows xp系统如何在电脑桌面上创建ADSL连接...
  5. Thymeleaf 是个什么?
  6. 拨开迷雾 看见vivo穿越周期的秘密
  7. 【大学物理实验】RL和RC串联电路的稳态特性研究
  8. 云计算openstack——云计算、大数据、人工智能(16)
  9. 此计算机必须为委派而被信任_允许受信任的用户进行委派
  10. 概率论:均值、方差与协方差矩阵