【问题标题】:Checking network status in C#在 C# 中检查网络状态
【发布时间】:2010-09-23 18:34:54
【问题描述】:

如何检查我是否有一个开放的网络连接并且可以联系 c# 中的特定 IP 地址?我在 VB.Net 中看到过示例,但它们都使用“我的”结构。 谢谢。

【问题讨论】:

    标签: c# .net network-programming


    【解决方案1】:

    如果您对 HTTP 状态代码感兴趣,可以使用以下方法:

    using System;
    using System.Net;
    
    class Program {
    
        static void Main () {
            HttpWebRequest req = WebRequest.Create(
                "http://www.oberon.ch/") as HttpWebRequest;
            HttpWebResponse rsp;
            try {
                rsp = req.GetResponse() as HttpWebResponse;
            } catch (WebException e) {
                if (e.Response is HttpWebResponse) {
                    rsp = e.Response as HttpWebResponse;
                } else {
                    rsp = null;
                }
            }
            if (rsp != null) {
                Console.WriteLine(rsp.StatusCode);
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用

      检查网络状态
      if(System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
      {
        //Do your stuffs when network available
      
      }
      else
      {
       //Do stuffs when network not available
      
      }
      

      【讨论】:

        【解决方案3】:

        第一个建议(IP连接)

        您可以尝试使用以下方式连接到 IP 地址:

        IPEndPoint ipep = new IPEndPoint(Ipaddress.Parse("IP TO CHECK"), YOUR_PORT_INTEGER);
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.Connect(ipep);
        

        我建议你检查一个“聊天”程序的代码。这些程序会操纵大量 IP 连接,并会让您很好地了解如何检查 IP 是否可用。

        第二个建议(Ping)

        您可以尝试 ping。这是一个很好的tutorial。您只需要做:

        Ping netMon = new Ping();
        PingResponse response = netMon.PingHost(hostname, 4);
        if (response != null)
        {
            ProcessResponse(response);
        }
        

        【讨论】:

        • 感谢您的建议。事实证明,ping 类非常有用。
        • Ping 数据包(ICMP 回显请求)通常会被防火墙阻止,因此在这种情况下,使用这种方法测试防火墙另一端服务器的可用性会失败。
        【解决方案4】:

        我的想法是有一个静态类/模块来对一个单独的线程进行监控。一个简单的 DNS 解析将确保您的网络是否正常运行。击败 ping IMO。

        Imports System.Net
        
        Public Module Network_Monitor
        
        Private InsideWorkNet As Boolean = vbFalse
        Private Online_Status As Boolean = vbFalse
        Private CurrentWorkIPAddress As New IPHostEntry
        Private WithEvents Timer_Online_Check As New Timers.Timer With {.Interval = 5000, .Enabled = True, .AutoReset = True}
        
        
        Public ReadOnly Property GetOnlineStatus() As String
        
            Get
                Return Online_Status
            End Get
        
        End Property
        
        
        Public Sub Initialize()
        
            Set_Online_Status()
            Timer_Online_Check.Start()
        
        End Sub
        
        
        Public Sub Set_Online_Status()
        
            If My.Computer.Network.IsAvailable Then
                Try
                    Dim DNSTest As IPHostEntry = Dns.GetHostEntry("google.com")
                    If DNSTest.AddressList.Length > 0 Then
                        Online_Status = True
                    Else : Online_Status = False
        
                    End If
        
                Catch ex As System.Net.Sockets.SocketException
        
                    Online_Status = False
        
                End Try
            End If
        
        End Sub
        
        
        Private Sub Timer_Online_Check_Elaspsed(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs) Handles Timer_Online_Check.Elapsed
            Set_Online_Status()
        End Sub
        
        Public Sub Detect_Work_Network()
        
            If Online_Status = True Then
        
                Dim WorkIP As IPHostEntry = New IPHostEntry()
        
                Try
                    WorkIP = Dns.GetHostEntry("serverA.myworkdomain.local")
                    If WorkIP.AddressList.Length > 0 Then
        
                        InsideWorkNet = True
                        CurrentWorkIPAddress = WorkIP
                        'MessageBox.Show(WorkIP.HostName.ToString(), "WorkIP", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    End If
                Catch ex As Sockets.SocketException
        
                    Try
                        WorkIP = Dns.GetHostEntry("serverA.myworkdomain.com")
                        If WorkIP.AddressList.Length > 0 Then
        
                            InsideWorkNet = False
                            CurrentWorkIPAddress = WorkIP
                            ' MessageBox.Show(WorkIP.HostName.ToString(), "WorkIP", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        End If
                    Catch ey As Sockets.SocketException
        
                    End Try
                End Try
            End If
        
        End Sub
        
        Public Function GetWorkServerName() As String
            If InsideWorkNet = True Then
                Return "serverA.myworkdomain.local"
            Else : Return "serverA.myworkdomain.com"
            End If
        
        
        End Function
        
        
        
        End Module
        

        我还必须确定我是在工作网络内部还是外部。防火墙两侧的不同服务器供应用与之通信。

        【讨论】:

          【解决方案5】:

          如果您想监控状态的变化,请使用System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged 事件:

          NetworkChange.NetworkAvailabilityChanged 
              += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
          _isNetworkOnline = NetworkInterface.GetIsNetworkAvailable();
          
          
          // ...
          void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
          {
              _isNetworkOnline  = e.IsAvailable;
          }
          

          【讨论】:

            【解决方案6】:

            如果您只想检查网络是否正常,请使用:

            bool networkUp
                = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
            

            要检查特定接口的状态(或其他信息),请使用:

            NetworkInterface[] networkCards
                = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
            

            要检查远程计算机的状态,您必须连接到该计算机(请参阅其他答案)

            【讨论】:

              【解决方案7】:

              好吧,你会尝试连接到特定的 ip,并处理拒绝和超时。

              查看 System.Net.Sockets 命名空间中的 TcpClient 类。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-03-04
                • 1970-01-01
                • 2019-07-02
                • 1970-01-01
                • 1970-01-01
                • 2019-03-24
                • 1970-01-01
                • 2010-09-08
                相关资源
                最近更新 更多