C# Socket连接请求超时机制实现代码分享

.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时控制机制。因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常。默认的等待时间长达20~30s。.Net Socket库的SocketOptionName.SendTimeout提供了控制发送数据的超时时间,但并非本文讨论的连接请求的超时时间。
实现

下面是实现的关键代码:

代码如下:

class TimeOutSocket
{
    private static bool IsConnectionSuccessful = false;
    private static Exception socketexception;
    private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);

public static TcpClient TryConnect(IPEndPoint remoteEndPoint, int timeoutMiliSecond)
    {
        TimeoutObject.Reset();
        socketexception = null;

string serverip = Convert.ToString(remoteEndPoint.Address);
        int serverport = remoteEndPoint.Port;          
        TcpClient tcpclient = new TcpClient();

tcpclient.BeginConnect(serverip, serverport,
            new AsyncCallback(CallBackMethod), tcpclient);

if (TimeoutObject.WaitOne(timeoutMiliSecond, false))
        {
            if (IsConnectionSuccessful)
            {
                return tcpclient;
            }
            else
            {
                throw socketexception;
            }
        }
        else
        {
            tcpclient.Close();
            throw new TimeoutException("TimeOut Exception");
        }
    }
    private static void CallBackMethod(IAsyncResult asyncresult)
    {
        try
        {
            IsConnectionSuccessful = false;
            TcpClient tcpclient = asyncresult.AsyncState as TcpClient;

if (tcpclient.Client != null)
            {
                tcpclient.EndConnect(asyncresult);
                IsConnectionSuccessful = true;
            }
        }
        catch (Exception ex)
        {
            IsConnectionSuccessful = false;
            socketexception = ex;
        }
        finally
        {
            TimeoutObject.Set();
        }
    }
}

(0)

相关推荐

  • c#连接sqlserver数据库、插入数据、从数据库获取时间示例

    c#连接sqlserver.插入数据.从数据库获取时间 复制代码 代码如下: using System;using System.Data.SqlClient; namespace Test{    //连接数据库    public class Connection    {        private static string connectionString =            "Server = 192.168.1.222;" +            "D

  • C#分布式事务的超时处理实例分析

    本文实例讲述了C#分布式事务的超时处理的方法.分享给大家供大家参考.具体分析如下: 事务是个很精妙的存在,我们在数据层.服务层.业务逻辑层等多处地方都会使用到. 在这里我只说下TransactionScope这个微软推荐使用的隐式事务.它是从Framework 2.0开始引入的一个事务管理类,在使用隐式事务时,事务完成前 程序应调用TransactionScope的Complete()方法,将事务提交,然后利用Dispose()释放事务对象.若执行期间出现错误,事务将自动回滚. 比如: usin

  • c#实现sqlserver事务处理示例

    复制代码 代码如下: private static void ExecuteSqlTransaction(string connectionString)    {        using (SqlConnection connection = new SqlConnection(connectionString))        {            connection.Open();            SqlCommand command = connection.CreateC

  • C#百万数据查询出现超时问题的解决方法

    本文较为详细的讲解了C#百万数据查询出现超时问题的解决方法,分享给大家供大家参考之用.具体方法如下: 很多时候我们用C#从百万数据中筛选一些信息时,经常会出现程序连接超时的错误,常见的错误有很多,例如: Timeout expired. The timeout period elapsed prior to completion of the operation or the server等等 本文就常见的几种解决方案进行说明,感兴趣的可以对此加以改进与完善. ①.当然第一步要查看是否Conne

  • c#操作sqlserver数据库的简单示例

    1.在用windows模式登陆sql server 数据库 简历一个student的数据库,然后新建查询: 复制代码 代码如下: create table student( id     int  auto_increment  primary key, name char(10) not null, sex    char(10) not null, age   char(10) not null,   ) 2.在vs中新建一个项目,输入一下代码: 复制代码 代码如下: using Syste

  • C#线程执行超时处理与并发线程数控制实例

    本文实例讲述了C#线程执行超时处理与并发线程数控制的方法.分享给大家供大家参考.具体实现方法如下: 特别说明: 1.为了测试方便,这里对存储过程的执行是模拟的 2.这里限制了并发执行存储过程的最大个数,但并没有对并发线程数进行控制,与文章标题略有不符,但程序稍做改动即可控制并发线程数 代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.

  • C#更新SQLServer中TimeStamp字段(时间戳)的方法

    本文实例讲述了C#更新SQLServer中TimeStamp字段(时间戳)的方法.分享给大家供大家参考.具体实现方法如下: public partial class Form1 : Form { private SqlConnection mCnn = null; private long TimeStampValue; public Form1() { InitializeComponent(); mCnn = new SqlConnection(); mCnn.ConnectionStrin

  • C#控制台程序实现开启、关闭SQLServer服务的代码分享

    用了近一天的时间研究了C#如何开启SqlServer数据库的服务,起先应用的是C#自带的System.ServiceProcess.ServiceContorller类,但个人认为它在win7下效果不佳,或许由于个人系统问题,最终决定放弃去选择应用C#的system.diagnostice.process.start方法执行cmd指令,下面我示范开启SqlServer最具代表的两个服务mssqlserver与mssqlserveragent,下面是本人练习写的控制台下的代码,经由多次测试均可成功

  • C#访问SqlServer设置链接超时的方法

    本文实例讲述了C#访问SqlServer设置链接超时的方法.分享给大家供大家参考.具体实现方法如下: 下面这段代码设置超时时间为60秒,默认为30秒 using (connection) { SqlCommand sqlcommand = connection.CreateCommand(); sqlcommand.CommandTimeout = 60; //默认时间为 30 秒 sqlcommand.CommandText = sqlText; ... 希望本文所述对大家的C#程序设计有所帮

  • C# Socket连接请求超时机制实现代码分享

    .Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时控制机制.因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常.默认的等待时间长达20~30s..Net Socket库的SocketOptionName.SendTimeout提供了控制发送数据的超时时间,但并非本文讨论的连接请求的超时时间.实现 下面是实现的关键代码:

  • Java反射机制实例代码分享

    本文旨在对Java反射机制有一个全面的介绍,希望通过本文,大家会对Java反射的相关内容有一个全面的了解. 阅读本文之前,大家可先行参阅<重新理解Java泛型>. 前言 Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影.通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题.本文我们就从实际应用的角度出发,来应用一下Java的反射机制. 反射

  • Spring Cloud 请求重试机制核心代码分析

    场景 发布微服务的操作一般都是打完新代码的包,kill掉在跑的应用,替换新的包,启动. spring cloud 中使用eureka为注册中心,它是允许服务列表数据的延迟性的,就是说即使应用已经不在服务列表了,客户端在一段时间内依然会请求这个地址.那么就会出现请求正在发布的地址,而导致失败. 我们会优化服务列表的刷新时间,以提高服务列表信息的时效性.但是无论怎样,都无法避免有那么一段时间是数据不一致的. 所以我们想到一个办法就是重试机制,当a机子在重启时,同个集群的b是可以正常提供服务的,如果有

  • 测试php连接mysql是否成功的代码分享

    方法很简单: 将下面的代码保存为test.php,放到web目录里面执行即可. 复制代码 代码如下: <?php /*** 测试php与mysql连接* 编辑:www.jb51.net*/$link=mysql_connect("localhost","root","123"); if(!$link) echo "FAILD!连接错误,用户名密码不对"; else echo "OK!可以连接"; ?&

  • C#连接Excel驱动与示例代码分享

    代码如下: 复制代码 代码如下: string fileExt = Path.GetExtension(excelPath);            string conn = "";            if (fileExt == ".xls")            {                conn = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + excelPat

  • Java中Socket设置连接超时的代码分享

    前言 大家都知道Java的Socket如果连接不到指定IP和Port的主机,就会抛出IOException异常,而通常情况下,从连接到出现IOException会有一段不定的时长,就是所谓的超时时长,如果超时时长过长,在开发时会影响测试,如果代码成了产品,又会非常的影响用户体验,那么要怎么设置这个时长呢?下面来一起看看详细的介绍: Socket的类提供了一个方法: public void connect(SocketAddress endpoint, int timeout) throws IO

  • 深入了解Go的HttpClient超时机制

    目录 Java HttpClient 超时底层原理 Go Context 简介 Context 是什么 Context 三个特性例子 Go HttpClient 的另一种超时机制 超时机制简介 超时机制底层原理 超时机制小结 Java 能实现这种超时机制吗 总结 Java HttpClient 超时底层原理 在介绍 Go 的 HttpClient 超时机制之前,我们先看看 Java 是如何实现超时的. 写一个 Java 原生的 HttpClient,设置连接超时.读取超时时间分别对应到底层的方法

  • 解决Java处理HTTP请求超时的问题

    在发送POST或GET请求时,返回超时异常处理办法: 捕获 SocketTimeoutException | ConnectTimeoutException | ConnectionPoolTimeout 异常 三种异常说明: SocketTimeoutException:是Java包下抛出的异常,这定义了Socket读数据的超时时间,即从server获取响应数据须要等待的时间:当读取或者接收Socket超时会抛出SocketTimeoutException. ConnectTimeoutExc

  • python使用socket连接远程服务器的方法

    本文实例讲述了python使用socket连接远程服务器的方法.分享给大家供大家参考.具体如下: import socket print "Creating socket...", s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print "done." print "Looking up port number...", port = socket.getservbyname('htt

  • PHP中Socket连接及读写数据超时问题分析

    本文实例讲述了PHP中Socket连接及读写数据超时问题.分享给大家供大家参考,具体如下: 虽然PHP中对fsockopen()方法有连接socket的超时参数,但是没有类似C中的连接成功后对数据的读写超时参数设置.没关系,PHP中对stream提供了一系列的方法以防止超时 stream_set_blocking( $fp , false ) 设置数据流为阻塞模式,以防止数据没读完就退出 如果模式为 false, 给定的 socket 描述符将切换到非块模式, 如果为 true, 则切换到块模式

随机推荐