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
TcpClient.Connect函数连接超时的问题(转载)相关推荐
- TCP解决connect函数的超时问题
在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未完成;同时TCP的三路握手操作继续进行;在这之后,我们可以调 ...
- connect 连接超时
原文地址:http://blog.csdn.net/codeheng/article/details/44625495 在使用TCP的connect连接服务器时,在默认情况下系统使用的是阻塞式sock ...
- TCP Connect 函数超时的问题
TCP 客户端通过 connect 函数连接服务器时,若服务器此时不在线或者当前网络不正常,会在 connect 函数中阻塞(默认情况下系统使用阻塞式 socket),直到超时时间到达,而这个超时时间 ...
- MySQL连接问题【如何解决MySQL连接超时关闭】
--MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...
- socket connec连接超时处理
最近把win32下的网关服务转到linux平台时遇到connect连接超时问题,经过多方收集资料简单整理下方便以后查找 linux或者win32控制台程序中connect函数默认是阻塞的,成功则返回0 ...
- C语言socket connect()函数(初始化套接字上的连接)(未完)(如何测试socket是否已经断开,如何判断socket是否断开)
参考文章:C网络编程socket之connect函数 需研究下这个函数超时多久才返回... 文章目录 项目中注释解释 man 2 文档解释 关于上面man 2 手册中所提到的connect()案例,在 ...
- bind()和connect()函数:绑定套接字并建立连接
socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的 IP 地址和端口绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理. ...
- c#中connect函数_C#.NET 各种连接字符串
1.C#连接连接Access 程序代码: using System.Data; using System.Data.OleDb; .. string strConnection=" ...
- Failed connect to github-production-release-asset-2e65be.s3.amazonaws.com:443; 连接超时
安装docker-machine的时候, 提示下载错误, 解决方式如下: 1. 错误提示 [root@localhost logs]# curl -L https://github.com/docke ...
最新文章
- 基于vue的公共looploading组件(vue循环加载--组件)
- 【正一专栏】俄罗斯世界杯来了——抽签概述
- 初学Java Web(4)——Servlet学习总结
- qbuttongroup如何都不选中_全程马拉松,半程马拉松该如何跑?很多人都不知道这些细节...
- java生产者实现kafka拦截器
- ubuntun 16.04 AttributeError: type object 'Callable' has no attribute '_abc_registry'
- 山寨一个ini文件的解析器
- 搜索推荐广告中的Position Bias:美团DPIN
- 机器学习之问题建模(一)
- Java或Web中解决所有路径问题
- 【ArcPy视频教程】基于 ArcGIS Pro 的 ArcPy 教程(录制中)
- mdui.js手机端侧边滑出导航菜单
- 具体数学_计算机科学基础(第2版)pdf
- 基于穿戴式智能化步态分析仪的步态分析
- 【Qt】无法定位程序输入点 于动态链接库
- 【雷达】毫米波雷达和激光雷达
- java excel 数组公式_Apache poi中的数组公式
- C#自定义控件添加至工具箱的方法
- DSP之定时器理论笔记
- 俩人同样写代码,我拿七千他咋五万八...