123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- #include "StdAfx.h"
- #include "SockAddrIn.h"
- #include "SocketHandle.h"
- // SockAddrIn 类实现;
- SockAddrIn SockAddrIn::NULLAddr;
- SockAddrIn::SockAddrIn()
- {
- Clear();
- }
- SockAddrIn::SockAddrIn(IN const SockAddrIn& sin)
- {
- Copy( sin );
- }
- SockAddrIn::~SockAddrIn(){}
- // 清空结构体;
- void SockAddrIn::Clear()
- {
- memset(this, 0, sizeof(sockaddr_storage));
- }
- /************************************************************************/
- /* 函数:Copy[2/28/2016 IT];
- /* 描述:复制结构体;
- /* 参数:;
- /* [IN] sin:SockAddrIn对象引用;;
- /* 返回:返回this指针;
- /* 注意:;
- /* 示例:;
- /*
- /* 修改:;
- /* 日期:;
- /* 内容:;
- /************************************************************************/
- SockAddrIn& SockAddrIn::Copy(IN const SockAddrIn& sin)
- {
- ss_family = sin.ss_family;
- memcpy(this, &sin, Size());
- return *this;
- }
- /************************************************************************/
- /* 函数:IsEqual[2/28/2016 IT];
- /* 描述:对比网络地址对象是否相同;
- /* 参数:;
- /* [IN] :;
- /* 返回:相同返回TRUE,否则返回FALSE;
- /* 注意:;
- /* 示例:;
- /*
- /* 修改:;
- /* 日期:;
- /* 内容:;
- /************************************************************************/
- bool SockAddrIn::IsEqual(IN const SockAddrIn& sin) const
- {
- if ( ss_family == AF_INET )
- {// AF_INET是IPV4协议地址簇专有,则需要忽略sin_zero[8]数组;
- return (memcmp(this, &sin, Size() - 8) == 0);
- }
- // 如果是IPV6地址结构(AF_INET6);
- return (memcmp(this, &sin, Size()) == 0);
- }
- /************************************************************************/
- /* 函数:CreateFrom[2/29/2016 IT];
- /* 描述:创建服务端套接字地址,主要参数以字符串形式传入;
- /* 参数:;
- /* [IN] pszAddr:服务端地址或服务端主机名;
- /* [IN] pszService:字符串形式的IP端口或服务名;
- /* [IN] nFamily:网络地址族类型(IPV4或IPV6);
- /* [OUT] :;
- /* [IN/OUT] :;
- /* 返回:成功创建返回TRUE;
- /* 注意:;
- /* 示例:;
- /*
- /* 修改:;
- /* 日期:;
- /* 内容:;
- /************************************************************************/
- bool SockAddrIn::CreateFrom(IN LPCTSTR pszAddr, IN LPCTSTR pszService, IN int nFamily /*=AF_INET*/, bool bIsClient /*= true*/)
- {
- Clear();
- CSocketHandle::GetAddressInfo(pszAddr, pszService, nFamily, *this, bIsClient);
- return !IsNull();
- }
- /************************************************************************/
- /* 函数:CreateFrom[2/29/2016 IT];
- /* 描述:创建服务端套接字地址,主要参数以数值形式传入(只支持IPV4);
- /* 参数:;
- /* [IN] lIPAddr:数值形式的IP地址;
- /* [IN] nPort:数值形式的服务端端口号;
- /* [IN] nFamily:网络地址簇类型(默认AF_INET);
- /* [IN] bFmtHost:
- /* 标志IP地址(参数1)和端口(参数2)是主机字节序HBO(Host By Order),即小端模式(little-endian)
- /* 或网络字节序NBO(NetWork By Order),即大端模式(big-endian);
- /* 返回:成功创建返回TRUE;
- /* 注意:该函数只支持IPV4网络地址;
- /* 示例:;
- /*
- /* 修改:;
- /* 日期:;
- /* 内容:;
- /************************************************************************/
- bool SockAddrIn::CreateFrom(IN ULONG lIPAddr, IN USHORT nPort, IN int nFamily /*= AF_INET*/, IN bool bFmtHost /*= true*/)
- {
- Clear();
- _ASSERTE( nFamily == AF_INET ); // supports IPv4 only
- SOCKADDR_IN* psin = reinterpret_cast<SOCKADDR_IN*>(this);
- psin->sin_family = static_cast<short>(nFamily);
- if ( bFmtHost )
- {
- psin->sin_addr.s_addr = htonl( lIPAddr );
- psin->sin_port = htons( nPort );
- }
- else
- {
- psin->sin_addr.s_addr = lIPAddr;
- psin->sin_port = nPort;
- }
- return !IsNull();
- }
|