C# 中使用TCP连接设置超时问题
在使用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连接设置超时问题相关推荐
- Linux网络协议栈:Linux 中每个 TCP 连接最少占用多少内存?
Linux 中每个 TCP 连接最少占用多少内存? https://zhuanlan.zhihu.com/p/25241630 因为原文作者明确说明,不可转载,这里我只给出链接,仅供参考.
- linux命令查看tcp连接,查看linux系统中的TCP连接
查看Linux的TCP连接 netstat -na 查看哪些IP连接本机 netstat -na Active Internet connections (servers and establi ...
- Linux系统tcp连接设置
目录 net.ipv4.tcp_syn_retries net.ipv4.ip_local_port_range net.core.somaxconn net.ipv4.tcp_max_syn_bac ...
- tcp 连接,黑洞,超时
1. lvs 建立在 tcp 之上, 先通过某个 port 建立了连接, 然后通过 seesion 转发给 realServer. tcp本身连接建立了,维护链接的定时器是keepalive,这个不 ...
- php alarm,php中pcntl_alarm为函数设置超时限制
原理是在函数执行前先设定一个时钟信号,如果函数的执行超过规定时间,信号会被触发,信号处理函数(sig)会抛出一个异常,被外层代码捕获.这样就跳出了原来函数的执行,接着执行下面的代码.如果函数在规定的时 ...
- Nginx笔记-反向代理中配置WebSocket及设置超时
这里贴下配置: ... server{listen 8888;server_name MyWeb;location / {proxy_pass http://xxx.xx.xx.xxx:xxxx;}l ...
- TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接
一.TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...
- 三次握手和四次挥手图解_详解 TCP 连接的“三次握手”与“四次挥手”
作者 | AhuntSun 责编 | Elle TCP connection 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西: 由于TCP不存在连接的概念 ...
- 详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”
作者 | AhuntSun 责编 | Elle TCP connection 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西: 由于TCP不存在连接的概 ...
最新文章
- “Attention is All You Need 翻译
- 浅析校园安防视频监控设备发展趋势
- 进制转换与ascll码利用
- 以后所有内容均以摘要方式发布
- 那些你踩过的币圈投资陷阱(下)
- linux系统调用理解之摘录(1)
- MySQL自动备份到本地数据库_MYSQL数据库自动本地/异地双备份/MYSQL增量备份
- Java中几种常量池的区分
- linux主频限制服务,linux抵御DDOS攻击 通过iptables限制TCP连接和频率
- java生成动态验证码_java动态生成验证码
- oracle 对象类型是什么意思,Oracle-对象类型
- 【没有assembly目录】spark2.0.0启动时无法访问spark-assembly-*.jar的解决办法
- 自学考试应该怎样答题才能更高分?
- StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction(ECCV 2018)
- 不忘初心,不负韶华,17款迈巴赫S400升级20款迈巴赫S680包围
- mac 取消 “Ctrl+空格“切换输入法
- 网页设计-公用导航栏
- 张瑞驰作文分享《蚕的自述》
- 爬取《你好,李焕英》影评,并生成词云图
- div css sprites精灵-CSS图像拼合 CSS贴图定位网页背景素材图片拼合定位布局技术教程