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

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

IPAddress修正。SocketAddressクラスを実装。IPAdderssのスコープがよくわからないので、とりあえずコメントアウト

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