验证socket能否连接

该代码示例展示了如何使用ManualResetEvent和AsyncCallback判断一个Socket在指定超时时间内是否成功连接到指定的IP和端口。通过BeginConnect发起异步连接请求,然后使用WaitOne等待结果,最后通过Connected属性确认连接状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        //用于控制进程等待
        private static ManualResetEvent socketReset = new ManualResetEvent(true);
        //暂时使用的超时时间的设定 单位:秒
        public static int overTimes = 2;

        #region 判断socket状态
        /// <summary>
        /// 在超时时间内判断连接是否存在或通畅
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public static bool IsConnect(string ip, int port)
        {
            //重置等待变量
            socketReset.Reset();
            //准备参数
            bool connected = false;
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAddress = null;
            IPAddress.TryParse(ip, out ipAddress);
            //获取ipe
            IPEndPoint iep = new IPEndPoint(ipAddress, port);
            //尝试请求
            socket.BeginConnect(ipAddress, port, new AsyncCallback(ConnCallback), socket);
            //等待尝试请求
            socketReset.WaitOne(overTimes * 1000);
            connected = socket.Connected;
            socket.Close();

            return connected;
        }
        /// <summary>
        /// Connect的回调函数   
        /// </summary>
        /// <param name="result"></param>
        private static void ConnCallback(IAsyncResult result)
        {
            try
            {
                Socket socketAsync = result.AsyncState as Socket;

                if (socketAsync != null)
                {
                    //开始连接
                    socketAsync.EndConnect(result);
                    //连接成功,提前结束等待
                    socketReset.Set();
                }
            }
            catch (Exception ex)
            {
                //连接失败
            }
        }
        #endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值