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

时间:2021-10-26 06:52:05 

.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();
        }
    }
}

标签:请求超时,Socket连接
0
投稿

猜你喜欢

  • Java IO异常如何处理详析

    2023-12-04 21:51:29
  • Android三方依赖冲突Gradle中exclude的使用

    2023-05-05 05:09:56
  • Java数据结构BFS广搜法解决迷宫问题

    2023-12-03 16:04:33
  • Java IO流相关知识代码解析

    2023-08-05 05:48:04
  • Java常用集合与原理解析

    2023-04-01 14:26:42
  • 将本地jar包安装进入maven仓库(实现方法)

    2022-06-18 00:35:54
  • .NET中的async和await关键字使用及Task异步调用实例

    2021-09-06 03:37:41
  • SpringBoot如何实现Tomcat自动配置

    2022-04-28 02:44:10
  • MyBatis通用的10种写法总结大全

    2022-08-01 12:04:02
  • Android权限HaloPermission详细使用

    2021-08-18 07:14:46
  • Android应用启动白屏处理方案详解

    2022-06-24 23:09:18
  • Gradle属性设置及环境变量全面教程

    2023-08-10 18:20:51
  • C# memcache 使用介绍

    2022-11-25 12:25:57
  • C#控制图像旋转和翻转的方法

    2023-11-26 08:25:08
  • Java初学者常问的问题(推荐)

    2023-05-29 05:41:51
  • ssm框架下web项目,web.xml配置文件的作用(详解)

    2021-07-31 14:42:11
  • 浅谈单例模式和线程安全问题

    2023-11-25 06:27:34
  • Linux下Hadoop 2.7.3 安装搭建过程

    2023-11-08 05:13:59
  • 详解MyBatis直接执行SQL查询及数据批量插入

    2021-12-02 17:52:08
  • C#中如何连接海康威视

    2022-12-13 20:48:44
  • asp之家 软件编程 m.aspxhome.com