/*! @brief sockaddr構造体のラップ @author OverTaker @date 2008/10/08 */ Namespace System Namespace Net Class SocketAddress item As *Byte itemSize As Long Public /*! @brief コンストラクタ。アドレスファミリを指定して初期化する。 @param アドレスファミリ */ Sub SocketAddress(family As Sockets.AddressFamily) Select Case family Case System.Net.Sockets.AddressFamily.InterNetwork init(family, SizeOf(sockaddr_in)) Case System.Net.Sockets.AddressFamily.InterNetworkV6 init(family, SizeOf(sockaddr_in6)) Case Else init(family, SizeOf(sockaddr)) End Select End Sub /*! @brief コンストラクタ。アドレスファミリと大きさを指定して初期化する。 @param アドレスファミリ @param 大きさ */ Sub SocketAddress(family As Sockets.AddressFamily, size As Long) init(family, size) End Sub /*! @brief コンストラクタ。sockaddrを指定して初期化する @param sockaddr構造体 @note このコンストラクタはライブラリ内でのみ使用する目的で作られています。 */ Sub SocketAddress(addr As *sockaddr, len As Long) itemSize = len item = malloc(itemSize) memcpy(item, addr, itemSize) End Sub /*! @brief デストラクタ */ Sub ~SocketAddress() If item <> NULL Then free(item) End Sub /*! @brief アドレスファミリを取得する @return アドレスファミリ */ Function AddressFamily() As Sockets.AddressFamily Return New Sockets.AddressFamily(Items->sa_family, "AddressFamily") End Function /*! @brief sockaddrを取得する @return sockaddrを示すアドレス */ Function Items() As *sockaddr Return item As *sockaddr End Function /*! @brief sockaddrの大きさを取得する @return sockaddrの大きさ */ Function Size() As Long Return itemSize End Function /*! @brief 等しいかどうかを取得する @retval True 等しい @retval False 等しくない */ Function Equals(address As SocketAddress) As Boolean If This.Size = address.Size Then Dim i As Long For i = 0 To ELM(Size) If This.item[i] <> address.item[i] Then Return False Next Return True Else Return False End If End Function Private /*! @brief 初期化する @param アドレスファミリ @param 確保するsockaddrの大きさ */ Sub init(family As DWord, size As Long) itemSize = size item = calloc( itemSize ) Items->sa_family = family As Word End Sub End Class End Namespace End Namespace