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

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

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

File size: 6.3 KB
Line 
1
2/*!
3 @brief DNS名前解決をする関数群
4 @author OverTaker
5 @date 2008/10/19
6*/
7
8
9Namespace System
10Namespace Net
11Namespace Dns
12
13/*!
14@brief ホスト名からIPアドレスを取得します
15@param ホスト名
16@return IPAddressクラスが格納されたリスト
17*/
18Function GetHostAddresses(hostname As String) As System.Collections.Generic.List<IPAddress>
19 Return GetHostEntry(hostname).IPAddressList
20End Function
21
22/*!
23@brief IPアドレスからホストの情報を取得します
24@param IPアドレスを表すIPAddressクラス
25@return ホスト情報が格納されたIPHostEntryクラス
26*/
27Function GetHostEntry(ip As IPAddress) As IPHostEntry
28 Return GetHostEntry(ip.ToString())
29End Function
30
31/*!
32@brief ホスト名からホストの情報を取得します
33@param ホスト名
34@return ホスト情報が格納されたIPHostEntryクラス
35*/
36Function GetHostEntry(hostname As String) As IPHostEntry
37 Return GetHostEntry(hostname, String.Empty)
38End Function
39
40/*!
41@brief ホスト名とポート番号からホストの情報を取得します
42@param ホスト名
43@param ポート番号
44@return ホスト情報が格納されたIPHostEntryクラス
45*/
46Function GetHostEntry(hostname As String, port As Word) As IPHostEntry
47 Return GetHostEntry(hostname, port.ToString())
48End Function
49
50/*!
51@brief ホスト名とサービス名からホストの情報を取得します
52@param ホスト名
53@param サービス名
54@return ホスト情報が格納されたIPHostEntryクラス
55*/
56Function GetHostEntry(hostname As String, service As String) As IPHostEntry
57 Dim results As *addrinfo
58 If getaddrinfo(ToTCStr(hostname), ToTCStr(service), ByVal 0, results) Then
59 Throw New System.Net.Sockets.SocketException(WSAGetLastError(), "Dns.GetHostEntry: Failed to getaddrinfo.")
60 End If
61 Return New Detail.IPHostEntryAddrinfo(results)
62End Function
63
64/*!
65@brief 自身のコンピュータのホスト名を取得します
66@return ホスト名
67*/
68Function GetHostName() As String
69 Return GetHostEntry(String.Empty, "").HostName
70End Function
71
72/*!
73@brief ホスト名からIPアドレスを非同期で取得します
74@param ホスト名
75@param コールバック
76@param ユーザー情報
77@return 非同期の操作をするIAsyncResultインターフェース
78*/
79Function BeginGetHostAddresses(hostname As String, callback As AsyncCallback, state As Object) As IAsyncResult
80 Return BeginGetHostEntry(hostname, callback, state)
81End Function
82
83/*!
84@brief ホスト名からホストの情報を取得します
85@param ホスト名
86@param コールバック
87@param ユーザー情報
88@return 非同期の操作をするIAsyncResultインターフェース
89*/
90Function BeginGetHostEntry(hostname As String, callback As AsyncCallback, state As Object) As IAsyncResult
91 Return BeginGetHostEntry(hostname, String.Empty, callback, state)
92End Function
93
94/*!
95@brief ホスト名とサービス名からホストの情報を取得します
96@param ホスト名
97@param サービス名
98@param コールバック
99@param ユーザー情報
100@return 非同期の操作をするIAsyncResultインターフェース
101*/
102Function BeginGetHostEntry(hostname As String, service As String, callback As AsyncCallback, state As Object) As IAsyncResult
103 Dim data As Detail.AsyncGetHostEntryData
104 data.Hostname = hostname
105 data.Service = service
106 data.Callback = callback
107
108 Dim result = New Detail.AsyncGetHostEntryResult(state)
109 data.Result = result
110 Threading.ThreadPool.QueueUserWorkItem(AddressOf(Detail.AsyncGetHostEntry), data)
111 Return result
112End Function
113
114/*!
115@brief BeginGetHostAddressesの結果を待ち、取得します
116@param BeginGetHostAddressesで取得したIAsyncResultインターフェース
117@return IPAddressクラスが格納されたリスト
118@note この関数は、結果が取得されるまでブロッキングが発生します
119*/
120Function EndGetHostAddresses(ar As IAsyncResult) As System.Collections.Generic.List<IPAddress>
121 Dim result = ar As Detail.IAsyncGetResult
122 Return result.WaitAndGetResult().IPAddressList
123End Function
124
125/*!
126@brief BeginGetHostEntryの結果を待ち、取得します
127@param BeginGetHostEntryで取得したIAsyncResultインターフェース
128@return ホスト情報が格納されたIPHostEntryクラス
129@note この関数は、結果が取得されるまでブロッキングが発生します
130*/
131Function EndGetHostEntry(ar As IAsyncResult) As IPHostEntry
132 Dim result = ar As Detail.IAsyncGetResult
133 Return result.WaitAndGetResult()
134End Function
135
136Namespace Detail
137
138Sub AsyncGetHostEntry(o As Object)
139 Dim data = o As AsyncGetHostEntryData
140 Dim results As *addrinfo
141 If getaddrinfo(ToTCStr(data.Hostname), ToTCStr(data.Service), ByVal 0, results) Then
142 data.Result.SetException(New ActiveBasic.Windows.WindowsException(WSAGetLastError(), "Dns.GetHostEntry: Failed to getaddrinfo."))
143 End If
144 data.Result.Result = New Detail.IPHostEntryAddrinfo(results)
145
146 data.Result.AsyncEventWaitHandle.Set()
147 If Not ActiveBasic.IsNothing(data.Callback) Then
148 Dim c = data.Callback
149 c(data.Result)
150 End If
151End Sub
152
153Class AsyncGetHostEntryData
154 hostname As String
155 service As String
156Public
157 Callback As AsyncCallback
158 Result As AsyncGetHostEntryResult
159
160 Function Hostname() As String
161 Return hostname
162 End Function
163
164 Sub Hostname(name As String)
165 If Not String.IsNullOrEmpty(name) Then hostname = String.Copy(name)
166 End Sub
167
168 Function Service() As String
169 Return service
170 End Function
171
172 Sub Service(serv As String)
173 If Not String.IsNullOrEmpty(serv) Then service = String.Copy(serv)
174 End Sub
175End Class
176
177Interface IAsyncGetResult
178 Inherits IAsyncResult
179 Function WaitAndGetResult() As IPHostEntry
180End Interface
181
182Class AsyncGetHostEntryResult
183Implements IAsyncGetResult
184Public
185 Sub AsyncGetHostEntryResult(s As Object)
186 state = s
187 wait = New Threading.EventWaitHandle(False, System.Threading.EventResetMode.ManualReset)
188 End Sub
189
190 Function AsyncState() As Object
191 Return state
192 End Function
193
194 Function AsyncWaitHandle() As Threading.WaitHandle
195 Return wait
196 End Function
197
198 Function AsyncEventWaitHandle() As Threading.EventWaitHandle
199 AsyncEventWaitHandle = wait
200 End Function
201
202 Function CompletedSynchronously() As Boolean
203 Return False
204 End Function
205
206 Function IsCompleted() As Boolean
207 Return AsyncWaitHandle.WaitOne(0)
208 End Function
209
210 Override Function WaitAndGetResult() As IPHostEntry
211 AsyncWaitHandle.WaitOne()
212 If Not ActiveBasic.IsNothing(exception) Then
213 Throw exception
214 End If
215 Return Result
216 End Function
217
218 Sub SetException(ex As Exception)
219 exception = ex
220 End Sub
221
222 Result = Nothing As IPHostEntry
223Private
224 state As Object
225 wait As Threading.EventWaitHandle
226 exception As Exception
227End Class
228
229End Namespace
230
231End Namespace
232End Namespace
233End Namespace
Note: See TracBrowser for help on using the repository browser.