当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-25

    本文导语:  .Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时控制机制。因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常。默认的等待...

.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#开发Socket通讯的方法
  • c# socket编程udp客户端实现代码分享
  • C# Socket粘包处理讲解示例
  • C#实现Socket通信的解决方法
  • c# socket网络编程接收发送数据示例代码
  • 学习C# Socket入门实例代码
  • C#实现的Socket服务器端、客户端代码分享
  • c#(Socket)同步套接字代码示例
  • c#(Socket)同步套接字代码的实例代码
  • C#中使用Socket获取网页源代码的代码
  • C#使用Socket获取网页源代码的实例代码
  • c#(Socket)异步套接字代码示例
  • C# Socket 异步套接字的代码一例
  • C#之Socket操作类实例解析
  • C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨
  • epoll,socket超时如何设置?
  • 求教一个socket超时的问题
  • 关于Socket编程:如何设置超时?
  • 关于Socket中connect连接host的超时问题,急!!!
  • 如何设置linux下socket的2MS超时(会者不难的简单问题)????
  • 求linux下 设置socket接收超时的方法
  • socket的select使用超时的问题
  • Linux下Socket接收超时和主机端口 如何区分
  • 求助socket超时控制编程的问题(java)!!!!急急!!!!
  • socket通信时,select一直返回超时的问题
  • 如何设置Socket链接超时,在线等,一定给分!
  • python socket 超时设置 errno 10054
  • socket 连接超时的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 能够在端口9001上监听其他应用的UDP请求,并打印其请求的数据包内容。先不管什么格式,请问如何用socket编写。
  • 创建了2个套接字Raw socket和socket,都调用recvfrom(),一个专门捕获数据包,一个在9001端口监听UDP请求,怎么不行?
  • socket通信 请求应答
  • unix socket编程的问题--服务器突然断掉,客户端如何察觉并发动请求重新连接
  • 关于用socket发送http请求的问题
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 我的ping程序怎么老是出现Socket operation on non-socket
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • sco unix 下输入 man socket 居然显示 man:socket not found up有分


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3