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

 更新时间:2013年12月09日 11:12:44   投稿:zxhpj  
这篇文章主要介绍了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();
        }
    }
}

相关文章

  • C#生成不重复随机字符串类

    C#生成不重复随机字符串类

    这篇文章主要介绍了C#生成不重复随机字符串类,涉及C#随机数与字符串的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 深入解析C#设计模式编程中对建造者模式的运用

    深入解析C#设计模式编程中对建造者模式的运用

    这篇文章主要介绍了C#设计模式编程中对建造者模式的运用,文中还介绍了在.NET框架下建造者模式编写思路的实现,需要的朋友可以参考下
    2016-02-02
  • C#从XmlDocument提取完整字符串的方法

    C#从XmlDocument提取完整字符串的方法

    文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,方法二利用`XmlWriterSettings`控制格式,并通过`MemoryStream`作为输出流,可以自定义编码,如UTF-8,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • 在.NET项目中嵌入Python代码的实践指南

    在.NET项目中嵌入Python代码的实践指南

    在现代开发中,.NET 与 Python 的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如 HTTP API 或进程间通信)往往带来性能损耗和复杂架构,所以本文给大家介绍了在.NET项目中嵌入Python代码的方法,需要的朋友可以参考下
    2025-08-08
  • winform实现拖动文件到窗体上的方法

    winform实现拖动文件到窗体上的方法

    这篇文章主要介绍了winform实现拖动文件到窗体上的方法,以实例分析了C#中WinForm操作窗体及文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • c#动态调用Webservice的两种方法实例

    c#动态调用Webservice的两种方法实例

    这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下
    2013-08-08
  • C#编程实现动态改变配置文件信息的方法

    C#编程实现动态改变配置文件信息的方法

    这篇文章主要介绍了C#编程实现动态改变配置文件信息的方法,涉及C#针对xml格式文件的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 详解Winform里面的缓存使用

    详解Winform里面的缓存使用

    这篇文章主要介绍了Winform里面的缓存使用,有需要的朋友可以参考一下
    2014-01-01
  • C# memcached缓存使用实例代码

    C# memcached缓存使用实例代码

    这篇文章主要介绍了C# memcached缓存使用实例,大家参考使用
    2013-12-12
  • C#开发中常用的加密解密方法汇总

    C#开发中常用的加密解密方法汇总

    这篇文章主要介绍了C#开发中常用的加密解密方法汇总,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-11-11

最新评论