c#套接字检查连接

时间:2013-08-27 20:37:13

标签: c# sockets asyncsocket

我正在尝试为特定端口建立到主机/ IP地址的套接字连接。我试图实现的主要内容是:

  • 获取展位成功/失败连接的响应时间(以毫秒为单位)
  • 使用自定义超时,例如5秒(5000)

所以基本上如果我指定一个主机名如google.com和端口80,这应该检查连接是否有效,如果我指定173.194.70.101和端口80它应该相同工作

如果我指定了例如google.com和端口7788之类的主机名,则这不应该起作用,因为该端口未打开。如果我指定IP:173.194.70.101和端口'7788',这应该不起作用。

如果我指定一些随机主机,例如sdfzsdfaklsf.com和端口7788,这应该不起作用,因为主机不存在。

对于上述所有情况,我需要所有成功/失败的响应时间......

我最终得到了这个代码和接缝工作正常,但我想问这是否是一种正确的方法呢?

     public string CheckConnection(string ipAddressOrHostName, string portName)
    {
        Stopwatch timer = new Stopwatch();
        timer.Start();
        Socket server = null;
        string elapsed = string.Empty;

        try
        {

            IPHostEntry hostEntry = Dns.GetHostEntry(ipAddressOrHostName);

            IPAddress ipAddress = hostEntry.AddressList[0];

            IPEndPoint ip = new IPEndPoint(ipAddress, Convert.ToInt32(portName));

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

            IAsyncResult result = server.BeginConnect(ip, null, null);

            result.AsyncWaitHandle.WaitOne(5000, true);

            timer.Stop();

            elapsed = timer.ElapsedMilliseconds.ToString();


            if (!server.Connected)
            {                    
                server.Close();
                throw new Exception();
            }
            else
            {   
                string status = string.Format("Connected succesfully to: {0} in: {1} milliseconds", server.RemoteEndPoint.ToString(), elapsed);                   
                server.Shutdown(SocketShutdown.Both);
                server.Close();

                return status;
            }
        }
        catch (Exception)
        {
            timer.Stop();

            elapsed = timer.ElapsedMilliseconds.ToString();

            return string.Format("Connection failed to: {0}:{1} in: {2} milliseconds", ipAddressOrHostName, portName, elapsed);                     
        }

    }

1 个答案:

答案 0 :(得分:2)

非常好。几点:

  1. 抓住更多特定类型的例外并对其进行测试。你不想捕捉不相关的东西或隐藏错误。
  2. 在完成DNS解析后启动计时器
  3. throw new Exception不太好,因为异常不是指控制流。重构方法不需要这个黑客。
  4. 您可能希望使用任务而不是IAsyncResult。没有功能变化,只是更现代的风格。
  5. 您在一些地方有冗余(例如重复关闭,重复ToString)。
  6. 解析方法之外的端口。它不属于那里。实际上,如果端口是不可解析的,那么此时会触发感知超时,因为会抛出异常。这就是我用点(1)警告你的。过多地使用异常会导致您可能永远不会知道的错误,因为它是隐藏的。