閱讀598 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C# 網絡編程之獲取本機名、ip地址、域名、物理位置

在C#網絡編程中,主機域名與ip之間能相互轉換,同時DNS中有Dns類、IPHostEntry類、IPAddress類、DnsPermission類實現DNS的一些簡單功能。
下麵主要講述一個C#的Windows應用程序,實現以下功能:
(1).獲取主機名稱;
(2).獲取本地電腦的ip地址;
(3).輸入遠程域名www.xxx.com,查詢其網址的ip地址;
(4).根據其遠程網址的ip地址,查找其物理位置;
(5).根據物理位置實現查找當地位置的天氣預報(未實現).
具體步驟如下:
1.創建C#項目
點擊”文件”->”新建項目”->”C# Windows應用程序”,選擇存儲位置與項目名稱,創建一個ipAddress項目.
2.添加控件
在”解決方案”中右鍵Form1.cs,查看其代碼設計器.設置如下圖所示的控件,界麵設計的具體屬性如下:

6個Label控件,其Text屬性分別對應”主機名稱”、”ip地址”..和”天氣預報”;
6個textBox控件,其中除”查詢遠程域名(輸入)”是輸入形如:www.xxx.com外,其餘均是輸出相應的獲取結果,對應的TextBox1-TextBox6;
1個richTextBox控件,提供高級輸入編輯文本功能控件,左邊textBox中顯示的結果在此處同時顯示匯總結果;
2個button控件,分別是”開始查詢”和”清除記錄”,清空richTextBox中內容.
3.添加新的命名控件
//添加新的命名空間
usingSystem.Net;
usingSystem.IO;
usingSystem.Xml;
在.NET平台對Dns類的命名控件是System.Net:調用其函數方法獲取本地名稱、ip地址、域名ip間轉換.System.IO可以提供編碼IO流的操作(似乎沒用到),System.Xml是根據ip地址,通過訪問”有道”網站查詢實際物理位置中獲取xml網頁等操作使用.
4.雙擊”開始掃描”按鈕,添加相應的事件代碼
privatevoidbutton1_Click(objectsender,EventArgse)
{
//添加代碼實現具體功能操作,具體如下
}
如果想添加"清除記錄"功能,則雙擊"清除記錄"按鈕,添加下麵代碼即可實現:
privatevoidbutton2_Click(objectsender,EventArgse)
{
richTextBox1.Clear(); //清理記錄
}
具體代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

//添加新的命名空間
using System.Net;
using System.IO;
using System.Xml;

namespace ipAddress
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //點擊按鈕"開始查詢"創建Click事件
        private void button1_Click(object sender, EventArgs e)
        {
            //構造一個主機對象 IPHostEntry兩個常用屬性(AddressList地址列表|HostName主機名稱)
            IPHostEntry myHost = new IPHostEntry();

            try
            {
                //一.通過獲取主機名HostName獲取主機Host信息
                myHost = Dns.GetHostByName(Dns.GetHostName()); 
               
                //textBox1編輯框:顯示主機名稱
                textBox1.Text = myHost.HostName.ToString();
                
                //richTextBox1高級文本輸入編輯控件:AppendText函數追加本地主機信息
                richTextBox1.AppendText("1.本地主機名稱-->"+myHost.HostName.ToString()+"\r");

                //二.獲取本地ip地址
                for (int i = 0; i < myHost.AddressList.Length; i++)
                {
                    textBox2.Text = myHost.AddressList[i].ToString();
                    richTextBox1.AppendText("2.本地主機ip地址-->"+myHost.AddressList[i].ToString()+"\r");
                }

                //三.輸入遠程ip地址\域名查詢 
                //構造一個遠程主機對象和字符串變量strIP存儲ip地址
                IPHostEntry otherHost = new IPHostEntry();
                int j;

                //Resolve函數:將域名轉換為ip地址 www.baidu.com
                otherHost = Dns.Resolve(textBox3.Text);

                //獲取遠程查詢ip地址
                for (j = 0; j < otherHost.AddressList.Length; j++)
                {
                    textBox4.Text = otherHost.AddressList[j].ToString();
                    richTextBox1.AppendText("3.遠程域名-->"+textBox3.Text+"\r*ip地址-->"+otherHost.AddressList[j].ToString()+"\r");
                }

                //四.ip地址查找對應的物理位置
                //通過訪問有道網站查詢ip的物理位置 (方法二:下載一個ip庫,查找ip庫中的內容)
                string sURL = "https://www.youdao.com/smartresult-xml/search.s?type=ip&q=" 
                    + otherHost.AddressList[j-1].ToString() + "";  //youdao的URL

                //定義字符串變量存儲物理位置
                string stringIpAddress = "";

                //獲取youdao返回的xml格式文件內容  
                using (XmlReader read = XmlReader.Create(sURL))
                {  
                    while(read.Read())      //從流中讀取下一個字節
                    {  
                        switch (read.NodeType)  
                        {  
                            case XmlNodeType.Text:      //取xml格式文件當中的文本內容  查詢的是最後一個ip地址AddressList[j-1]
                                if (string.Format("{0}", read.Value).ToString().Trim() != otherHost.AddressList[j-1].ToString())  
                                {  
                                    stringIpAddress = string.Format("{0}", read.Value).ToString().Trim();  //賦值  
                                }  
                                break;  
                        }  
                   }  
                }  

                //textBox5對話框:賦值物理位置並追加至richTextBox1末尾
                textBox5.Text = stringIpAddress;
                richTextBox1.AppendText("4.物理位置-->"+stringIpAddress+"\r");
            }
            catch(Exception msg)
            {
                MessageBox.Show(msg.Message);          //提示錯誤信息
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();                     //清理記錄
        }
    }
}

5.運行結果
輸入www.google.com,點擊"開始查詢"

 

輸出結果如下圖所示:

可以看到,我的主機名稱為delldell及本地的ip地址.同時查詢的google的相應ip地址很多,在richTextBox中顯示遠程域名的ip地址,其中物理地址為最後一個ip地址74.125.31.104的物理位置為“美國加利福利亞州山景市穀歌公司”
(注意:天氣預報我沒有做該功能,但原理相同通過訪問一個天氣預報的網站,根據物理位置顯示相應的天氣,原理相同)
6.總結
這是我最近學習C#網絡編程的自己編寫的一個實例,通過獲取ip地址你可以做很多的事情,譬如QQ等網站顯示的你所在地天氣預報、判斷異地登陸、黑客攻擊等,這是一個很基礎的System.Net\System.Xml的相關方法函數的使用。
而在根據ip地址輸出判斷其物理位置中使用的是popping_dancer的博客知識,上麵的代碼“四.ip地址查找對應的物理位置”也是引用轉載他的文章,希望大家也能看看他的這篇文章,非常有用。非常感謝博主及他的文章,網址如下:
https://blog.csdn.net/popping_dancer/article/details/8297038
他采用的方法是通過獲取ip地址,訪問“有道”網址查看對應的物理位置,上麵訪問google其訪問過程如下圖所示:

上麵僅僅是我對C#網絡編程,DNS、域名、ip地址、物理位置轉換之間的一些認識,僅供大家學習與了解,如果有錯誤或不足之處,見諒!希望能幫助大家。
( 2013-7-8 By:Eastmount)

 

最後更新:2017-04-03 16:48:32

  上一篇:go Android SystemProperties和Settings.System介紹
  下一篇:go 【OpenHW參賽手記】AXI初體驗