SockAddrIn.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /************************************************************************/
  2. /* Copyright (C), 2016-2020, [IT], 保留所有权利;
  3. /* 模 块 名:SockAddrIn;
  4. /* 描 述:SockAddrIn结构体,内部封装了 SOCKADDR_STORAGE (IPv4: SOCKADDR_IN, IPv6: SOCKADDR_IN6) 结构体;
  5. /*
  6. /*
  7. /* 版 本:[V];
  8. /* 作 者:[IT];
  9. /* 日 期:[2/23/2016];
  10. /*
  11. /*
  12. /* 注 意:;
  13. /*
  14. /* 修改记录:[IT];
  15. /* 修改日期:;
  16. /* 修改版本:;
  17. /* 修改内容:;
  18. /************************************************************************/
  19. #ifndef __SOCKADDRIN_20160303__
  20. #define __SOCKADDRIN_20160303__
  21. #pragma once
  22. #ifdef WIN32
  23. #include <winsock2.h>
  24. #include <ws2tcpip.h>
  25. #elif BSD_SOCKET
  26. #include "platform.h"
  27. #endif
  28. struct SockAddrIn : public sockaddr_storage
  29. {
  30. public:
  31. SockAddrIn();
  32. ~SockAddrIn();
  33. // 拷贝构造;
  34. SockAddrIn(IN const SockAddrIn& sin);
  35. // 复制函数;
  36. SockAddrIn& Copy(IN const SockAddrIn& sin);
  37. // 清空结构体;
  38. void Clear();
  39. // 对比地址是否相同;
  40. bool IsEqual(IN const SockAddrIn& sin) const;
  41. // 如果NULLAddr无效,返回TRUE;
  42. bool IsNull() const { return IsEqual(NULLAddr); }
  43. // 返回地址簇类型;
  44. short GetFamily() const { return ss_family; }
  45. // 返回IPV4网络地址;
  46. ULONG GetIPAddr() const { return ((SOCKADDR_IN*)this)->sin_addr.s_addr; }
  47. // 获取网络端口;
  48. short GetPort() const { return ((SOCKADDR_IN*)this)->sin_port; }
  49. // 创建服务端地址(同时支持IPV4和IPV6);
  50. bool CreateFrom(IN LPCTSTR pszAddr, IN LPCTSTR pszService, IN int nFamily /*= AF_INET*/, bool bIsClient = true);
  51. // 创建服务端地址(只支持IPV4);
  52. bool CreateFrom(IN ULONG lIPAddr, IN USHORT nPort, IN int nFamily = AF_INET, IN bool bFmtHost = true);
  53. // 赋值拷贝函数,返回this指针引用;
  54. SockAddrIn& operator=(const SockAddrIn& sin) { return Copy( sin ); }
  55. // 相等操作判断,相等返回TRUE;
  56. bool operator==(const SockAddrIn& sin) const { return IsEqual( sin ); }
  57. // 不等操作判断,如果不同返回TRUE;
  58. bool operator!=(const SockAddrIn& sin) const { return !IsEqual( sin ); }
  59. // 转换SOCKADDR地址,返回SOCKADDR格式的this对象;
  60. operator LPSOCKADDR() { return reinterpret_cast<LPSOCKADDR>(this); }
  61. // 转换PIN6_ADDR地址,返回PIN6_ADDR格式的this对象;
  62. operator const IN6_ADDR*() const { return reinterpret_cast<const IN6_ADDR*>(this); }
  63. // 转换PIN6_ADDR地址,返回PIN6_ADDR格式的this对象;
  64. operator PIN6_ADDR() { return reinterpret_cast<PIN6_ADDR>(this); }
  65. // 返回结构体(SOCKADDR_IN) 或 (SOCKADDR_STORAGE)的大小(由地址协议簇决定);
  66. size_t Size() const { return (ss_family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_storage); }
  67. // 以SOCKADDR_IN结构体来初始化this对象;
  68. void SetAddr(IN const sockaddr_in* psin) { SetAddr(reinterpret_cast<const sockaddr_storage*>(psin)); }
  69. // 以SOCKADDR_IN6结构体来初始化this对象;
  70. void SetAddr(IN const sockaddr_in6* psin) { SetAddr(reinterpret_cast<const sockaddr_storage*>(psin)); }
  71. // 以SOCKADDR_STROAGE结构体来初始化this对象;
  72. void SetAddr(IN const sockaddr_storage* pss) { ss_family = pss->ss_family; memcpy(this, pss, Size()); }
  73. // 空的地址值,用于比较另一地址是否空;
  74. static SockAddrIn NULLAddr;
  75. };
  76. #endif
  77. /* // IPV4地址结构;
  78. /* struct SOCKADDR_IN{
  79. /* SHORT sin_family; // 地址簇;
  80. /* USHORT sin_port; // 端口号;
  81. /* in_addr sin_addr; // 地址;
  82. /* CHAR sin_zero[8]; // IPV4为了填充结构体来保持固定大小,无意义;
  83. /* };
  84. /*
  85. /* struct IN_ADDR{
  86. /* unsigned long s_addr; // 地址;
  87. /* };
  88. /*
  89. /* // IPV6地址结构;
  90. /* struct SOCKADDR_IN6{
  91. /* USHORT sin6_family; // 地址簇类型:AF_INET6;
  92. /* USHORT sin6_port; // 16位端口号;
  93. /* ULONG sin6_flowinfo; // 32位流标签;
  94. /* in6_addr sin6_addr; // 128位IP地址;
  95. /* union
  96. /* {
  97. /* ULONG sin6_scope_id; // Set of interfaces for a scope.
  98. /* SCOPE_ID sin6_scope_struct;
  99. /* };
  100. /* };
  101. /*
  102. /* struct in6_addr {
  103. /* union {
  104. /* UCHAR Byte[16];
  105. /* USHORT Word[8];
  106. /* } u;
  107. /* } ;
  108. /*
  109. /* typedef struct {
  110. /* union {
  111. /* struct
  112. /* {
  113. /* ULONG Zone : 28;
  114. /* ULONG Level : 4;
  115. /* };
  116. /* ULONG Value;
  117. /* };
  118. /* } SCOPE_ID, *PSCOPE_ID;
  119. */