Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#插座检查连接_C#_Sockets_Asyncsocket - Fatal编程技术网

c#插座检查连接

c#插座检查连接,c#,sockets,asyncsocket,C#,Sockets,Asyncsocket,我正在尝试为特定端口建立到主机/ip地址的套接字连接。我努力实现的主要目标是: 获取booth成功/失败连接的响应时间(以毫秒为单位) 使用自定义超时,例如5秒(5000) 因此,基本上,如果我指定一个主机名,如google.com和端口80,这应该检查连接是否正常工作,如果我指定173.194.70.101和端口80也应该正常工作 例如,如果我指定主机名,如google.com和端口7788,这应该不起作用,因为该端口未打开。如果我指定IP:173.194.70.101和端口“7788”,

我正在尝试为特定端口建立到主机/ip地址的套接字连接。我努力实现的主要目标是:

  • 获取booth成功/失败连接的响应时间(以毫秒为单位)
  • 使用自定义超时,例如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);                     
        }

    }

非常好。有几点:

  • 捕获一个更为特定的异常类型,并对其进行测试。你不想捕捉无关的东西或隐藏bug
  • 完成DNS解析后启动计时器
  • 抛出新异常
    不太好,因为异常并不表示为控制流。重新构造该方法,使其不需要这种攻击
  • 您可能希望使用任务而不是
    IAsyncResult
    。没有功能上的改变,只是更现代的风格
  • 您在少数位置(例如重复关闭、重复到字符串)有冗余
  • 分析方法外部的端口。它不属于那里。事实上,如果端口不可解析,您将在此时触发感知超时,因为将引发异常。这就是我在第(1)点警告你的。过多地使用异常会导致一个错误,因为它是隐藏的,所以您可能永远不会知道

  • 我将改进您的异常处理。不建议捕获一般异常并将其视为特定的网络/连接故障。还可以尝试将关闭/关机/停止呼叫放入“finally”块。。。。除此之外,我认为这看起来很好。你能告诉我如何实现AsyncWait而不是IAsyncResult吗?我认为这超出了这个问题的范围。搜索“等待套接字”以查找答案。如果您还有其他问题,请告诉我。我确实实现了异步等待,而不是IAsyncResult,但我失去了对自定义超时的控制,默认情况下,我认为是20秒。。。但无论如何,谢谢你的评论!明确地说,我不建议在这里等待。我只是推荐了没有等待的任务(例如Task.Wait(5000))。但这只是一种微弱的偏好。