[648] | 1 |
|
---|
| 2 | /*!
|
---|
| 3 | @brief インターネットワーク端末のアドレスを表します。
|
---|
| 4 | @author OverTaker
|
---|
| 5 | @date 2008/10/18
|
---|
| 6 | */
|
---|
| 7 |
|
---|
| 8 |
|
---|
| 9 |
|
---|
| 10 | Namespace System
|
---|
| 11 | Namespace Net
|
---|
| 12 |
|
---|
| 13 |
|
---|
| 14 | Class IPEndPoint
|
---|
| 15 | Inherits EndPoint
|
---|
| 16 | Public
|
---|
| 17 |
|
---|
| 18 | /*!
|
---|
| 19 | @brief コンストラクタ
|
---|
[649] | 20 | */
|
---|
| 21 | Sub IPEndPoint()
|
---|
| 22 | End Sub
|
---|
| 23 |
|
---|
| 24 | /*!
|
---|
| 25 | @brief コンストラクタ
|
---|
[648] | 26 | @param IPアドレスを表した32ビット値(ネットワークバイトオーダー)
|
---|
| 27 | @param ポート番号(ホストバイトオーダー)
|
---|
| 28 | */
|
---|
| 29 | Sub IPEndPoint(ip As DWord, port As Word)
|
---|
| 30 | init( New IPAddress(ip), port )
|
---|
| 31 | End Sub
|
---|
| 32 |
|
---|
| 33 | /*!
|
---|
| 34 | @brief コンストラクタ
|
---|
| 35 | @param IPAddressクラス
|
---|
| 36 | @param ポート番号(ホストバイトオーダー)
|
---|
| 37 | */
|
---|
| 38 | Sub IPEndPoint(ip As IPAddress, port As Word)
|
---|
| 39 | init(ip, port)
|
---|
| 40 | End Sub
|
---|
| 41 |
|
---|
| 42 | /*!
|
---|
| 43 | @brief 等しいかどうかを取得する
|
---|
| 44 | @retval True 等しい
|
---|
| 45 | @retval Flase 等しくない
|
---|
| 46 | */
|
---|
| 47 | Function Equals(endPoint As IPEndPoint) As Boolean
|
---|
| 48 | Return socketAddress.Equals(endPoint.socketAddress)
|
---|
| 49 | End Function
|
---|
| 50 |
|
---|
| 51 | /*!
|
---|
| 52 | @brief IPEndPointを文字列で表す
|
---|
| 53 | @return アドレスとポート番号が文字列で表されます
|
---|
| 54 | */
|
---|
| 55 | Override Function ToString() As String
|
---|
| 56 | Dim temp[64] As TCHAR
|
---|
| 57 | If WSAAddressToString(socketAddress.Items As sockaddr, socketAddress.Size, ByVal 0, temp, Len(temp)) Then
|
---|
| 58 | Throw New System.Net.Sockets.SocketException(WSAGetLastError(), "IPEndPoint.ToString: Failed to WSAAddressToString.")
|
---|
| 59 | Else
|
---|
| 60 | Return New String(temp)
|
---|
| 61 | End If
|
---|
| 62 | End Function
|
---|
| 63 |
|
---|
| 64 | /*!
|
---|
| 65 | @brief IPEndPointが表すIPアドレスを取得する
|
---|
| 66 | @return IPAddressクラス
|
---|
| 67 | */
|
---|
| 68 | Function Address() As IPAddress
|
---|
[649] | 69 | Return New IPAddress(socketAddress.Items)
|
---|
[648] | 70 | End Function
|
---|
| 71 |
|
---|
| 72 | /*!
|
---|
| 73 | @brief ポート番号を設定する
|
---|
| 74 | @param ポート番号(ホストバイトオーダー)
|
---|
| 75 | */
|
---|
| 76 | Sub Port(port As Word)
|
---|
| 77 | Select Case AddressFamily
|
---|
| 78 | Case System.Net.Sockets.AddressFamily.InterNetwork
|
---|
| 79 | Dim addr4 = socketAddress.Items As *sockaddr_in
|
---|
| 80 | addr4->sin_port = htons(port)
|
---|
| 81 | Case System.Net.Sockets.AddressFamily.InterNetworkV6
|
---|
| 82 | Dim addr6 = socketAddress.Items As *sockaddr_in6
|
---|
| 83 | addr6->sin6_port = htons(port)
|
---|
| 84 | Case Else
|
---|
| 85 | Throw New NotSupportedException("IPEndPoint.Port: Unknown AddressFamily.")
|
---|
| 86 | End Select
|
---|
| 87 | End Sub
|
---|
| 88 |
|
---|
| 89 | /*!
|
---|
| 90 | @brief ポート番号を取得する
|
---|
| 91 | @return ポート番号(ホストバイトオーダー)
|
---|
| 92 | */
|
---|
| 93 | Function Port() As Word
|
---|
| 94 | Select Case AddressFamily
|
---|
| 95 | Case System.Net.Sockets.AddressFamily.InterNetwork
|
---|
| 96 | Dim addr4 = socketAddress.Items As *sockaddr_in
|
---|
| 97 | Return ntohs(addr4->sin_port)
|
---|
| 98 | Case System.Net.Sockets.AddressFamily.InterNetworkV6
|
---|
| 99 | Dim addr6 = socketAddress.Items As *sockaddr_in6
|
---|
| 100 | Return ntohs(addr6->sin6_port)
|
---|
| 101 | Case Else
|
---|
| 102 | Throw New NotSupportedException("IPEndPoint.Port: Unknown AddressFamily.")
|
---|
| 103 | End Select
|
---|
| 104 | End Function
|
---|
| 105 |
|
---|
| 106 | /*!
|
---|
[649] | 107 | @brief SocketAddressクラスから作成する
|
---|
| 108 | @param SocketAddressクラス
|
---|
| 109 | @return SocketAddressを元に作成したIPEndPoint
|
---|
| 110 | */
|
---|
| 111 | Static Function Create(address As SocketAddress) As IPEndPoint
|
---|
| 112 | Dim point = New IPEndPoint
|
---|
| 113 | point.socketAddress = address
|
---|
| 114 | Return point
|
---|
| 115 | End Function
|
---|
| 116 |
|
---|
| 117 | /*!
|
---|
[648] | 118 | @brief 最大のポート番号を取得する
|
---|
| 119 | @return ポート番号(ホストバイトオーダー)
|
---|
| 120 | */
|
---|
| 121 | Static Function MaxPort() As Word
|
---|
| 122 | Return &HFFFF
|
---|
| 123 | End Function
|
---|
| 124 |
|
---|
| 125 | /*!
|
---|
| 126 | @brief 最小のポート番号を取得する
|
---|
| 127 | @return ポート番号(ホストバイトオーダー)
|
---|
| 128 | */
|
---|
| 129 | Static Function MinPort() As Word
|
---|
| 130 | Return 0
|
---|
| 131 | End Function
|
---|
| 132 |
|
---|
| 133 | Private
|
---|
| 134 |
|
---|
| 135 | /*!
|
---|
| 136 | @brief IPAddressクラスとポート番号から初期化する
|
---|
| 137 | @param IPAddressクラス
|
---|
| 138 | @param ポート番号(ホストバイトオーダー)
|
---|
| 139 | */
|
---|
| 140 | Sub init(ip As IPAddress, port As Word)
|
---|
| 141 | socketAddress = New SocketAddress(ip.AddressFamily)
|
---|
| 142 | Select Case ip.AddressFamily
|
---|
| 143 | Case System.Net.Sockets.AddressFamily.InterNetwork
|
---|
| 144 | Dim addr4 = socketAddress.Items As *sockaddr_in
|
---|
| 145 | memcpy(VarPtr(addr4->sin_addr.s_addr), ip.Address, SizeOf(in_addr))
|
---|
| 146 | Case System.Net.Sockets.AddressFamily.InterNetworkV6
|
---|
| 147 | Dim addr6 = socketAddress.Items As *sockaddr_in6
|
---|
| 148 | memcpy(VarPtr(addr6->sin6_addr.s6_addr), ip.Address, SizeOf(in6_addr))
|
---|
| 149 | Case Else
|
---|
| 150 | Throw New NotSupportedException("IPEndPoint.init: Not Supported AddressFamily.")
|
---|
| 151 | End Select
|
---|
| 152 | Port = port
|
---|
| 153 | End Sub
|
---|
| 154 | End Class
|
---|
| 155 |
|
---|
| 156 | End Namespace
|
---|
| 157 | End Namespace
|
---|