c# ManualResetEvent 解决socket连接超时问题

最近在做一个端口高速扫描器,在参考http://blog.csdn.net/hany3000/article/details/42422667 的博文时,发现一些问题,可能对读者造成误解,下面将对这个问题重新讲解


class Scanner
    {
        private ManualResetEvent TimeoutObject = new ManualResetEvent(false);//设置为false,使下次调用waitone阻塞线程,若为true,waitone将不会阻塞线程
        string m_host;
        int m_port;


        public Scanner(string host, int port)
        {
            m_host = host;
            m_port = port;
        }


        public void Scan()
        {
          //TimeoutObject.Reset();//此处没有必要
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            try
            {
                
                socket.BeginConnect(m_host, m_port, o => { TimeoutObject.Set(); //更改ManualResetEvent标志位为true,并通知waitone检测标志位 }, null);
                TimeoutObject.WaitOne(200, false);//此处阻塞线程,超时200MS
                if (socket.Connected)
                {
                    Program.IpList.Add(m_host);
                    Console.WriteLine(m_host + " 已连接");
                }
                else
                {
                    Console.WriteLine(m_host + " 无法连接");
                }
                socket.Dispose();
            }
            catch (Exception)
            {
                socket.Dispose();
            }
        }
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值