您的位置:首页 > 编程语言 > C#

c# socket连接请求超时设置

2012-12-15 11:11 633 查看
 C#中Socket的连接超时设置中,SendTimeout,ReceiveTimeout根本不起作用。开始本来准备通过c#中ping命令去判断服务器连接是否正常的,但是同样存在问题。如果服务器正常运作,而socket服务程序意外终止,那么客户端依然会认为socket服务程序连接正常,从而建立连接。这样连接一个已经终止的socket服务程序,导致可能需要等待10~20秒钟才能返回结果。极大的降低了用户体验效果。为此找到了以下方法解决这一问题。以下代码可能并不完美,比如如果在客户端连接成功后,网络突然中断,同样会造成客户端连接请求等待。希望有更好解决方法者,予以指教!

        private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false);

        /// <summary>

        /// 连接超时设置

        /// </summary>

        /// <param name="remoteEndPoint">ip</param>

        /// <param name="timeoutMSec">超时时间</param>

        /// <returns></returns>

        public bool SocketConnect(IPEndPoint remoteEndPoint, int timeout)

        {

            bool is_ok = false;

            TimeoutObject.Reset();

            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.BeginConnect(remoteEndPoint, CallBackMethod, socket);

            //阻塞当前线程,使其等待异步连接,如果在指定时间内

            if (TimeoutObject.WaitOne(timeout, false))

            {

                is_ok = true;//连接正常

            }

            else

            {

                is_ok = false;//连接中断

            }

            if (socket.Connected)

            {

                socket.Shutdown(SocketShutdown.Both);

                socket.Close();

            }

            return is_ok;

        }

        /// <summary>

        /// 异步回调方法

        /// </summary>

        /// <param name="asyncresult"></param>

        public void CallBackMethod(IAsyncResult ar)

        {

            //终止等待,使阻塞的线程继续

            TimeoutObject.Set();

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: