Namespace System Namespace Net /* @brief インターネットホストの情報を表すクラス @author OverTaker @date 2008/10/19 */ Class IPHostEntry Public /* @brief ホストに関連付けられた端末の情報をリストで取得する @return IPEndPointクラスが格納されたリスト */ Abstract Function HostList() As System.Collections.Generic.List /* @brief ホストに関連付けられた端末の情報を1つだけ取得する @return ホストの情報を表すIPEndPointクラス */ Abstract Function Host() As IPEndPoint /* @brief ホストに関連付けられたIPアドレスを取得する @return IPAddressクラスが格納されたリスト */ Abstract Function IPAddressList() As System.Collections.Generic.List /* @brief ホストに付けられている、他の名前を取得する @return 名前が格納されたリスト */ Abstract Function Aliases() As System.Collections.Generic.List /* @brief ホスト名を取得する @return ホスト名 */ Abstract Function HostName() As String End Class Namespace Detail /* @brief IPHostEntryクラスのaddrinfoを使った実装 */ Class IPHostEntryAddrinfo Inherits IPHostEntry infos As *addrinfo Public Sub IPHostEntryAddrinfo(addrinfos As *addrinfo) infos = addrinfos End Sub Sub ~IPHostEntryAddrinfo() freeaddrinfo(infos As addrinfo) End Sub Override Function HostList() As System.Collections.Generic.List Dim list As System.Collections.Generic.List Dim info = infos As *addrinfo While info <> NULL list.Add( IPEndPoint.Create( New SocketAddress(info->ai_addr, info->ai_addrlen) ) ) info = info->ai_next Wend Return list End Function Override Function Host() As IPEndPoint Return IPEndPoint.Create( New SocketAddress(infos->ai_addr, infos->ai_addrlen) ) End Function Override Function IPAddressList() As System.Collections.Generic.List Dim list As System.Collections.Generic.List Dim info = infos As *addrinfo While info <> NULL list.Add( New IPAddress(info->ai_addr)) info = info->ai_next Wend Return list End Function Override Function Aliases() As System.Collections.Generic.List Dim list As System.Collections.Generic.List Dim info = infos As *addrinfo Dim temp[ELM(NI_MAXHOST)] As TCHAR While info <> NULL If getnameinfo(info->ai_addr As sockaddr, info->ai_addrlen, temp, NI_MAXHOST, NULL, 0, 0) Then Throw New ActiveBasic.Windows.WindowsException(WSAGetLastError(), "IPHostEntry.Aliases: Failed to getnameinfo.") End If list.Add(New String(temp)) info = info->ai_next Wend Return list End Function Override Function HostName() As String Dim temp[ELM(NI_MAXHOST)] As TCHAR If getnameinfo(infos->ai_addr As sockaddr, infos->ai_addrlen, temp, NI_MAXHOST, NULL, 0, 0) Then Throw New ActiveBasic.Windows.WindowsException(WSAGetLastError(), "IPHostEntry.HostName: Failed to getnameinfo.") End If Return New String(temp) End Function End Class End Namespace End Namespace End Namespace