介紹在 WinForm 中該如何取得本機或外網及遠端 Socket 連線的 IP Address。
前言
在 Windows Form Application 裡對於取得 IP Address 有內網、外網兩種 IP Address ,如果只需要取得內網 IP Address ,可以透過使用 IPHostEntry 類別取得,而外網的話就必須要發送一個 Request 到一個可以取得 IP Address 的網站後再分析 Response 的內容,這個網站可以自己做或者使用現成的,如 http://www.whatismyip.com.tw/ 。
另外,在使用 Socket 通訊的情況下,也有可能有需要知道前來連結的客戶端的 IP Address 是什麼,這時就可以使用 Socket.RemoteEndPoint 屬性來取得遠端 IP 位址和通訊埠編號,以下就列出範例代碼看看該如何使用。
範例程式碼
取得內網 IP Address
/// <summary>
/// 取得本機 IP Address
/// </summary>
/// <returns></returns>
private List<string> GetHostIPAddress()
{
List<string> lstIPAddress = new List<string>();
IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ipa in IpEntry.AddressList)
{
if (ipa.AddressFamily == AddressFamily.InterNetwork)
lstIPAddress.Add(ipa.ToString());
}
return lstIPAddress; // result: 192.168.1.17 ......
}
取得外網 IP Address
/// <summary>
/// 取得外網 IP Address
/// </summary>
/// <returns></returns>
private string GetExtranetIPAddress()
{
HttpWebRequest request = HttpWebRequest.Create("http://www.whatismyip.com.tw") as HttpWebRequest;
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "Mozilla/5.0";
string ip = string.Empty;
WebResponse response = request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
string pattern = @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}";
ip = Regex.Match(result, pattern).ToString();
}
return ip; // result: 210.125.21.xxx
}
Socket 取得遠端 IP Address 與 Port
/// <summary>
/// 執行服務器監聽
/// </summary>
public static void RunServer()
{
// 建立X509憑證
ServerCertificate = new X509Certificate(Certificate, "ssl");
// 監聽任何IP Address來的訊息
listener = new TcpListener(System.Net.IPAddress.Any, 17170);
// 開啟監聽
listener.Start();
while (IsRun)
{
TcpClient client = listener.AcceptTcpClient();
ProcessClient(client);
}
}
/// <summary>
/// 接收客戶端訊息處理並回覆
/// </summary>
/// <param name="pClient"></param>
private static void ProcessClient(TcpClient pClient)
{
SslStream sslStream = new SslStream(pClient.GetStream(), true);
// 取得連接者 IP 與 Port
IPEndPoint point = pClient.Client.RemoteEndPoint as IPEndPoint;
string ip = point.Address.ToString(); // result: 127.0.0.1
string port = point.Port.ToString(); // result: 55236
// do something...
}
參考資料
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)