#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*/) { Clear(); CSocketHandle::GetAddressInfo(pszAddr, pszService, nFamily, *this); 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(this); psin->sin_family = static_cast(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(); }