SockAddrIn.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "StdAfx.h"
  2. #include "SockAddrIn.h"
  3. #include "SocketHandle.h"
  4. // SockAddrIn 类实现;
  5. SockAddrIn SockAddrIn::NULLAddr;
  6. SockAddrIn::SockAddrIn()
  7. {
  8. Clear();
  9. }
  10. SockAddrIn::SockAddrIn(IN const SockAddrIn& sin)
  11. {
  12. Copy( sin );
  13. }
  14. SockAddrIn::~SockAddrIn(){}
  15. // 清空结构体;
  16. void SockAddrIn::Clear()
  17. {
  18. memset(this, 0, sizeof(sockaddr_storage));
  19. }
  20. /************************************************************************/
  21. /* 函数:Copy[2/28/2016 IT];
  22. /* 描述:复制结构体;
  23. /* 参数:;
  24. /* [IN] sin:SockAddrIn对象引用;;
  25. /* 返回:返回this指针;
  26. /* 注意:;
  27. /* 示例:;
  28. /*
  29. /* 修改:;
  30. /* 日期:;
  31. /* 内容:;
  32. /************************************************************************/
  33. SockAddrIn& SockAddrIn::Copy(IN const SockAddrIn& sin)
  34. {
  35. ss_family = sin.ss_family;
  36. memcpy(this, &sin, Size());
  37. return *this;
  38. }
  39. /************************************************************************/
  40. /* 函数:IsEqual[2/28/2016 IT];
  41. /* 描述:对比网络地址对象是否相同;
  42. /* 参数:;
  43. /* [IN] :;
  44. /* 返回:相同返回TRUE,否则返回FALSE;
  45. /* 注意:;
  46. /* 示例:;
  47. /*
  48. /* 修改:;
  49. /* 日期:;
  50. /* 内容:;
  51. /************************************************************************/
  52. bool SockAddrIn::IsEqual(IN const SockAddrIn& sin) const
  53. {
  54. if ( ss_family == AF_INET )
  55. {// AF_INET是IPV4协议地址簇专有,则需要忽略sin_zero[8]数组;
  56. return (memcmp(this, &sin, Size() - 8) == 0);
  57. }
  58. // 如果是IPV6地址结构(AF_INET6);
  59. return (memcmp(this, &sin, Size()) == 0);
  60. }
  61. /************************************************************************/
  62. /* 函数:CreateFrom[2/29/2016 IT];
  63. /* 描述:创建服务端套接字地址,主要参数以字符串形式传入;
  64. /* 参数:;
  65. /* [IN] pszAddr:服务端地址或服务端主机名;
  66. /* [IN] pszService:字符串形式的IP端口或服务名;
  67. /* [IN] nFamily:网络地址族类型(IPV4或IPV6);
  68. /* [OUT] :;
  69. /* [IN/OUT] :;
  70. /* 返回:成功创建返回TRUE;
  71. /* 注意:;
  72. /* 示例:;
  73. /*
  74. /* 修改:;
  75. /* 日期:;
  76. /* 内容:;
  77. /************************************************************************/
  78. bool SockAddrIn::CreateFrom(IN LPCTSTR pszAddr, IN LPCTSTR pszService, IN int nFamily /*=AF_INET*/, bool bIsClient /*= true*/)
  79. {
  80. Clear();
  81. CSocketHandle::GetAddressInfo(pszAddr, pszService, nFamily, *this, bIsClient);
  82. return !IsNull();
  83. }
  84. /************************************************************************/
  85. /* 函数:CreateFrom[2/29/2016 IT];
  86. /* 描述:创建服务端套接字地址,主要参数以数值形式传入(只支持IPV4);
  87. /* 参数:;
  88. /* [IN] lIPAddr:数值形式的IP地址;
  89. /* [IN] nPort:数值形式的服务端端口号;
  90. /* [IN] nFamily:网络地址簇类型(默认AF_INET);
  91. /* [IN] bFmtHost:
  92. /* 标志IP地址(参数1)和端口(参数2)是主机字节序HBO(Host By Order),即小端模式(little-endian)
  93. /* 或网络字节序NBO(NetWork By Order),即大端模式(big-endian);
  94. /* 返回:成功创建返回TRUE;
  95. /* 注意:该函数只支持IPV4网络地址;
  96. /* 示例:;
  97. /*
  98. /* 修改:;
  99. /* 日期:;
  100. /* 内容:;
  101. /************************************************************************/
  102. bool SockAddrIn::CreateFrom(IN ULONG lIPAddr, IN USHORT nPort, IN int nFamily /*= AF_INET*/, IN bool bFmtHost /*= true*/)
  103. {
  104. Clear();
  105. _ASSERTE( nFamily == AF_INET ); // supports IPv4 only
  106. SOCKADDR_IN* psin = reinterpret_cast<SOCKADDR_IN*>(this);
  107. psin->sin_family = static_cast<short>(nFamily);
  108. if ( bFmtHost )
  109. {
  110. psin->sin_addr.s_addr = htonl( lIPAddr );
  111. psin->sin_port = htons( nPort );
  112. }
  113. else
  114. {
  115. psin->sin_addr.s_addr = lIPAddr;
  116. psin->sin_port = nPort;
  117. }
  118. return !IsNull();
  119. }