小弟打算未來寫一系列相關於Socket程式的文章,前幾篇定位主要為介紹Socket程式的基本概念以做為基礎。
小弟打算未來寫一系列相關於Socket程式的文章,前幾篇定位主要為介紹Socket程式的基本概念以做為基礎。
第一個要瞭解的是IPAddress類別:我們使用Socket程式大概最主要都是在撰寫TCP或UDP的通訊程式,不論是TCP或UDP都是以IP為第三層的通訊協定;而這類程式的定址都是以IP位址和通訊埠號做為基準,通訊埠號﹝Port﹞一般是以Int32的方式表示,故不用多做說明,不過在許多相關類別或方法中要使用到IP位址時通常會以IPAddress類別的執行個體為代表,第一個就是要告訴大家如何建立IPAddress類別執行個體。
(1)以建構函式的方法建立:MSDN文件庫中提到三種建構函式,不過因為第三種是專屬IPv6略去不談,可以用兩種方法建立IPAddress執行個體
(a) IPAddress(Int64):以Int64﹝也就是VB.NET中的Long﹞型別的參數來產生執行個體
範例:
Dim i As Long
i = 192 + 168 * 256 + 1 * 256 ^ 2 + 2 * 256 ^ 3
Dim myIpaddress As New IPAddress(i)
TextBox1.Text = "長整數:" & CStr(i) & "=" & myIpaddress.ToString
這個範例的IP位址是192.168.1.2,換算成長整數的算式則為 192 + 168*256 + 1*256^2 + 2*256^3
(b) IPAddress(Byte()):以Byte陣列作為參數來產生執行個體,較之使用Int64而言更直覺一些
範例:
Dim myByte() As Byte = {192, 168, 1, 2}
Dim myIpaddress As New IPAddress(myByte)
TextBox1.Text = "Byte陣列: {192, 168, 1, 2} =" & myIpaddress.ToString
(2)以IPAddress.Parse 靜態方法建立:這是將字串轉換為IPAddress執行個體的方法
範例:
Dim mystr = "192.168.1.2"
Dim myIpaddress As IPAddress = (IPAddress.Parse(mystr))
TextBox1.Text = "字串: 192.168.1.2 =" & myIpaddress.ToString
談到IPAddress.Parse就不得不順便談一下IPAddress.TryParse這個靜態方法,IPAddress.TryParse的用途是辨識所傳入的字串是否可有效的轉換為IPAddress執行個體,使用範例如下:
TextBox1.Clear()
Dim myStr = TextBox2.Text
Dim add As IPAddress = Nothing
If IPAddress.TryParse(myStr, add) = True Then
Dim myIpaddress As IPAddress = (IPAddress.Parse(myStr))
TextBox1.Text = "字串:" & myStr & "=" & myIpaddress.ToString
Else
TextBox1.Text = "字串:" & myStr & "為無效IP字串"
End If
我在測試這個方法的過程中發現了一個很有趣的事情,就是並非 aaa.bbb.ccc.ddd﹝例如192.168.1.1﹞這種字串才會被視為正確,它出現了一些非常奇特的現象,下表是我測試後的一些結果,提供給各位參考:
輸入字串 | 轉換後IP |
192 | 0.0.0.192 |
192.168 | 192.0.0.168 |
192.168.95 | 192.168.0.95 |
192.168.95.1 | 192.168.95.1 |
333 | 0.0.1.77 |
333.1 | 無效 |
1.333 | 1.0.1.77 |
333.333 | 無效 |
33663168 | 2.1.168.192 |
192. | 無效 |
.192 | 無效 |
192.1. | 無效 |
.192.1 | 無效 |