source: trunk/ab5.0/ablib/src/Classes/System/Net/IPAddress.ab

Last change on this file was 649, checked in by OverTaker, 16 years ago

IPHostEntry,Dnsクラスを半分実装。getaddrinfoがXPSP1以降にしかないので、gethostbyname版の実装もあとでします。

File size: 8.7 KB
Line 
1
2/*!
3 @brief IPアドレスを表すクラス
4 @author OverTaker
5 @date 2008/10/18
6*/
7
8
9Namespace System
10Namespace Net
11
12Class IPAddress
13 item As *Byte
14 size As Long
15 family As DWord
16Public
17
18 /*!
19 @brief アドレスをバイト配列で取得する
20 @return アドレスを表したバイト列
21 @note このメソッドはライブラリ内のみで使用する目的で作られています。
22 */
23 Function Address() As *Byte
24 Return item As *Byte
25 End Function
26
27 /*!
28 @brief コンストラクタ
29 */
30 Sub IPAddress()
31 End Sub
32
33 /*!
34 @brief コンストラクタ
35 @param IPアドレスを表した32bit値(ネットワークバイトオーダー)
36 */
37 Sub IPAddress(ip As DWord)
38 family = AF_INET
39 size = SizeOf(in_addr)
40 item = malloc(size)
41 memcpy(item, VarPtr(ip), size)
42 End Sub
43
44 /*!
45 @brief コンストラクタ
46 @param SocketAddressクラスから作成
47 @note このコンストラクタはライブラリ内のみで使用する目的で作られています。
48 */
49 Sub IPAddress(addr As *sockaddr)
50 family = addr.sa_family
51 Select Case family
52 Case AF_INET
53 Dim addr4 = addr As *sockaddr_in
54 size = SizeOf(in_addr)
55 item = malloc(size)
56 memcpy(item, VarPtr(addr4->sin_addr.s_addr), size)
57 Case AF_INET6
58 Dim addr6 = addr As *sockaddr_in6
59 size = SizeOf(in6_addr)
60 item = malloc(size)
61 memcpy(item, VarPtr(addr6->sin6_addr.s6_addr), size)
62 Case Else
63 Throw New NotSupportedException("IPAddress: Not Supported AddressFamily.")
64 End Select
65 End Sub
66
67 /*!
68 @brief コンストラクタ
69 @param IPアドレスを表したバイト列
70 @param IPアドレスの長さ
71 @note このコンストラクタはライブラリ内のみで使用する目的で作られています。
72 */
73 Sub IPAddress(af As DWord, address As *Byte, len As Long)
74 family = af
75 size = len
76 item = malloc(size)
77 memcpy(item, address, size)
78 End Sub
79
80 /*!
81 @brief デストラクタ
82 */
83 Sub ~IPAddress()
84 If item <> NULL Then free(item)
85 End Sub
86
87 Function Operator== (address As IPAddress) As Boolean
88 Return Equals(address)
89 End Function
90
91 /*!
92 @brief アドレスファミリを取得する。
93 @return アドレスファミリ
94 */
95 Function AddressFamily() As Sockets.AddressFamily
96 Return New System.Net.Sockets.AddressFamily(family, "AddressFamily")
97 End Function
98
99 /*!
100 @brief スコープを取得する。
101 @return スコープ
102 */
103/* Function ScopeId() As DWord
104 End Function
105*/
106 /*!
107 @brief リンクローカルアドレスかどうかを取得する。
108 @retval True リンクローカルアドレス
109 @retval Flase リンクローカルアドレスではない
110 */
111 Function IsIPv6LinkLocal() As Boolean
112 If family = AF_INET6 Then
113 Return (item[0] = &HFF) And (item[1] = &H00)
114 Else
115 Throw New System.Net.Sockets.SocketException("IPAddress.IsIPv6LinkLocal: AddressFamily is not IPv6.")
116 End If
117 End Function
118
119 /*!
120 @brief IPv6のマルチキャストアドレスかどうかを取得する。
121 @retval True IPv6のマルチキャストアドレス
122 @retval Flase IPv6のマルチキャストアドレス
123 */
124 Function IsIPv6Multicast() As Boolean
125 If family = AF_INET6 Then
126 Return (item[0] = &HFE) And (item[1] = &H80)
127 Else
128 Throw New System.Net.Sockets.SocketException("IPAddress.IsIPv6Multicast: AddressFamily is not IPv6.")
129 End If
130 End Function
131
132 /*!
133 @brief IPアドレスが等しいかどうかを取得する
134 @retval True 等しい
135 @retval Flase 等しくない
136 */
137 Function Equals(ip As IPAddress) As Boolean
138 If family = ip.family Then
139 Dim i As Long
140 For i = 0 To ELM(size)
141 If item[i] <> ip.item[i] Then Return False
142 Next
143 Return True
144 Else
145 Return False
146 End If
147 End Function
148
149 /*!
150 @brief IPアドレスを文字列で取得する
151 @return 文字列
152 */
153 Override Function ToString() As String
154 Dim temp[ELM(64)] As TCHAR
155 Dim ret As Long
156 Select Case family
157 Case AF_INET
158 Dim addr4 As sockaddr_in
159 addr4.sin_family = family As Integer
160 addr4.sin_addr.s_addr = GetDWord(item)
161 ret = WSAAddressToString(addr4 As sockaddr, SizeOf(sockaddr_in), ByVal 0, temp, Len(temp))
162 Case AF_INET6
163 Dim addr6 As sockaddr_in6
164 addr6.sin6_family = family As Word
165 memcpy(addr6.sin6_addr.s6_addr, item, size)
166 ret = WSAAddressToString(addr6 As sockaddr, SizeOf(sockaddr_in6), ByVal 0, temp, Len(temp))
167 Case Else
168 Throw New NotSupportedException("IPAddress.ToString: Unknown Protocol.")
169 End Select
170
171 If ret Then
172 Throw New System.Net.Sockets.SocketException(WSAGetLastError(), "IPAddress.ToString: Failed to WSAAddressToString.")
173 Else
174 Return New String(temp)
175 End If
176 End Function
177
178
179 /*!
180 @brief 文字列からIPAddressクラスを作成する
181 @param 文字列で表したIPアドレス
182 @return IPAddressクラス
183 @exception 作成に失敗した場合
184 */
185 Static Function Parse(ip As String) As IPAddress
186 Dim ipAddress = New IPAddress
187 If TryParse(ip, ipAddress) Then
188 Return ipAddress
189 Else
190 Throw New System.Net.Sockets.SocketException(WSAGetLastError(), "IPAddress.Parse: Failed to Parse.")
191 End If
192 End Function
193
194 /*!
195 @brief 文字列からIPAddressクラスを作成する
196 @param[in] 文字列で表したIPアドレス
197 @param[out] 作成したIPアドレスを格納するIPAddressクラス
198 @retval True 成功
199 @retval False 失敗
200 */
201 Static Function TryParse(ip As String, ByRef address As IPAddress) As Boolean
202 address = New IPAddress
203 If ip.Contains(".") Then
204 address.family = AF_INET
205 address.item = Detail.CreateAddressFromIPv4String(ip)
206 address.size = SizeOf(in_addr)
207 ElseIf ip.Contains(":") Then
208 address.family = AF_INET6
209 address.item = Detail.CreateAddressFromIPv6String(ip)
210 address.size = SizeOf(in6_addr)
211 Else
212 Return False
213 End If
214
215 If address.item <> NULL Then
216 Return True
217 Else
218 address = Nothing
219 Return False
220 End If
221 End Function
222
223 /*!
224 @brief Anyアドレスを作成
225 @return IPAddressクラス
226 */
227 Static Function Any() As IPAddress
228 Return New IPAddress(0 As DWord)
229 End Function
230
231 /*!
232 @brief ブロードキャストアドレスを作成
233 @return IPAddressクラス
234 */
235 Static Function Broadcast() As IPAddress
236 Return New IPAddress(&HFFFFFFFF)
237 End Function
238
239 /*!
240 @brief ループバックアドレスを作成
241 @return IPAddressクラス
242 */
243 Static Function Loopback() As IPAddress
244 Return New IPAddress( HostToNetworkOrder(&H7F000001) )
245 End Function
246
247 /*!
248 @brief Noneアドレスを作成
249 @return IPAddressクラス
250 */
251 Static Function None() As IPAddress
252 Return New IPAddress(&HFFFFFFFF)
253 End Function
254
255 /*!
256 @brief IPv6 Anyアドレスを作成
257 @return IPAddressクラス
258 */
259 Static Function IPv6Any() As IPAddress
260 Return IPAddress.Parse("::")
261 End Function
262
263 /*!
264 @brief IPv6 ループバックアドレスを作成
265 @return IPAddressクラス
266 */
267 Static Function IPv6Loopback() As IPAddress
268 Return IPAddress.Parse("::1")
269 End Function
270
271 /*!
272 @brief IPv6 Noneアドレスを作成
273 @return IPAddressクラス
274 */
275 Static Function IPv6None() As IPAddress
276 Return IPAddress.Parse("::")
277 End Function
278
279
280
281 /*!
282 @brief 16bitのホストバイトオーダーをネットワークバイトオーダーに変換する
283 @param ホストバイトオーダー
284 @return ネットワークバイトオーダー
285 */
286 Static Function HostToNetworkOrder(host As Word) As Word
287 Return htons(host)
288 End Function
289
290 /*!
291 @brief 32bitのホストバイトオーダーをネットワークバイトオーダーに変換する
292 @param ホストバイトオーダー
293 @return ネットワークバイトオーダー
294 */
295 Static Function HostToNetworkOrder(host As DWord) As DWord
296 Return htonl(host)
297 End Function
298
299 /*!
300 @brief 16bitのネットワークバイトオーダーをホストバイトオーダーに変換する
301 @param ネットワークバイトオーダー
302 @return ホストバイトオーダー
303 */
304 Static Function NetworkToHostOrder(network As Word) As Word
305 Return ntohs(network)
306 End Function
307
308 /*!
309 @brief 32bitのネットワークバイトオーダーをホストバイトオーダーに変換する
310 @param ネットワークバイトオーダー
311 @return ホストバイトオーダー
312 */
313 Static Function NetworkToHostOrder(network As DWord) As DWord
314 Return ntohl(network)
315 End Function
316End Class
317
318Namespace Detail
319
320 /*!
321 @brief IPv4アドレスを表した文字列からアドレスを作成する
322 @param IPv4アドレスを表したバイト列
323 @return バイト列
324 */
325 Function CreateAddressFromIPv4String(ip As String) As *Byte
326 Dim addr4 As sockaddr_in
327 If WSAStringToAddress(ToTCStr(ip), AF_INET, ByVal 0, addr4 As sockaddr, SizeOf(sockaddr_in)) Then
328 Return NULL
329 Else
330 Dim item = malloc(SizeOf(in_addr)) As *Byte
331 memcpy(item, VarPtr(addr4.sin_addr.s_addr), SizeOf(in_addr))
332 Return item
333 End If
334 End Function
335
336 /*!
337 @brief IPv6アドレスを表した文字列からアドレスを作成する
338 @param IPv6アドレスを表したバイト列
339 @return バイト列
340 */
341 Function CreateAddressFromIPv6String(ip As String) As *Byte
342 Dim addr6 As sockaddr_in6
343 If WSAStringToAddress(ToTCStr(ip), AF_INET6, ByVal 0, addr6 As sockaddr, SizeOf(sockaddr_in6)) Then
344 Return NULL
345 Else
346 Dim item = malloc(SizeOf(in6_addr)) As *Byte
347 memcpy(item, addr6.sin6_addr.s6_addr, SizeOf(in6_addr))
348 Return item
349 End If
350 End Function
351
352End Namespace
353
354End Namespace
355End Namespace
Note: See TracBrowser for help on using the repository browser.