在app中,我們經常需要確定網絡是否暢通,windows下自帶ping.exe 那么我們C#中如何實現ping操作呢。
Ping類位於System.Net.NetworkInformation下。通過它應用程序確定是否可通過網絡訪問遠程計算機。
Ping可確定 是否可成功聯系遠程主機。如果存在或配置了代理服務器、網絡地址轉換 (NAT) 設備或防火牆,可能會妨礙 Ping 成功。 Ping 成功只是表示可以通過網絡訪問遠程主機;但並不保證遠程主機上存在更高級別的服務(例如 Web 服務器)。
此類提供的功能類似於 Ping.exe 命令行工具。 Send 和 SendAsync 方法將 Internet 控制消息協議 (ICMP) 回送請求消息發送到遠程計算機並等待來自該計算機的 ICMP 回送答復消息。有關 ICMP 消息的詳細說明,請參見 RFC 792,這可以在 http://www.ietf.org 上找到。
PingOptions 類提供 Ttl 和 DontFragment 屬性以控制如何傳輸 Internet 控制消息協議 (ICMP) 回送請求數據包。
Ttl 屬性為 Ping 類發送的數據包指定生存時間。此值指示在丟棄 Ping 數據包之前可以轉發此數據包的路由節點數。如果要測試將數據包從源計算機發送到目標計算機所需的轉發數(也稱為躍點),設置此選項很有用。
DontFragment 屬性控制是否可將發送到遠程主機的數據分成多個數據包。如果要測試用於傳輸數據包的路由器和網關的最大傳輸單元 (MTU),此選項很有用。
PingOptions 類的實例被傳遞給 Send 和 SendAsync 方法,PingReply 類通過 Options 屬性返回 PingOptions 的實例
Ping 類嘗試將 Internet 控制消息協議 (ICMP) 回送請求發送到遠程計算機並接收該計算機通過 ICMP 回送答復消息返回的信息。 Ping 類使用 PingReply 類的實例返回有關操作的信息,如操作狀態以及發送請求和接收答復所用的時間。
Send 方法直接返回 PingReply 類的實例。 SendAsync 方法在 PingCompletedEventHandler 方法的 PingCompletedEventArgs 參數中返回 PingReply。通過 Reply 屬性訪問 PingReply。
如果 Status 的值不是 Success,則不應該使用由 RoundtripTime、Options 或 Buffer 屬性返回的值。 RoundtripTime 屬性將返回零,Buffer 屬性將返回空數組,而 Options 屬性將返回 null。
1 //Ping 實例對象; 2 Ping pingSender = new Ping(); 3 //ping選項; 4 PingOptions options = new PingOptions(); 5 options.DontFragment = true; 6 string data = "ping test data"; 7 byte[] buf = Encoding.ASCII.GetBytes(data); 8 //調用同步send方法發送數據,結果存入reply對象; 9 PingReply reply = pingSender.Send("www.baidu.com", 120, buf, options); 10 11 if (reply.Status == IPStatus.Success) 12 { 13 Console.WriteLine("主機地址::"+reply.Address); 14 Console.WriteLine("往返時間::"+reply.RoundtripTime); 15 Console.WriteLine("生存時間TTL::"+reply.Options.Ttl); 16 Console.WriteLine("緩沖區大小::"+reply.Buffer.Length); 17 Console.WriteLine("數據包是否分段::"+reply.Options.DontFragment); 18 }
//out put
MSDN:Ping >>> https://msdn.microsoft.com/zh-cn/library/system.net.networkinformation.ping%28v=vs.110%29.aspx
MSDN:PingOptions >>> https://msdn.microsoft.com/zh-cn/library/system.net.networkinformation.pingoptions%28v=vs.110%29.aspx
MSDN:PingReply >>> https://msdn.microsoft.com/zh-cn/library/system.net.networkinformation.pingreply%28v=vs.110%29.aspx