//目的:封装套接字,可以用来向网络发送、接收数据。阻塞调用函数。
//说明:本类从《VC++6.0技术内幕》中摘录并修改
#if !defined(_SOCKET_H)
#define _SOCKET_H
#include
#pragma comment(lib, "ws2_32.lib")
class CSockAddr : public sockaddr_in
{
public:
//构造函数
CSockAddr()
{ sin_family = AF_INET;
sin_port = 0;
sin_addr.s_addr = 0; } // Default
CSockAddr(const SOCKADDR& sa) { memcpy(this, &sa, sizeof(SOCKADDR)); }
CSockAddr(const SOCKADDR_IN& sin) { memcpy(this, &sin, sizeof(SOCKADDR_IN)); }
//ulAddr为INADDR_ANY时默认为本机任一IP
CSockAddr(const ULONG ulAddr, const USHORT ushPort = 0) // parms are host byte ordered
{ sin_family = AF_INET;
sin_port = htons(ushPort);
sin_addr.s_addr = htonl(ulAddr); }
CSockAddr(const char* pchIP, const USHORT ushPort = 0) // dotted IP addr string
{ sin_family = AF_INET;
sin_port = htons(ushPort);
sin_addr.s_addr = inet_addr(pchIP); } // already network byte ordered
//以点的格式返回地址
LPCTSTR GetIPDottedDecimal()
{
return inet_ntoa(sin_addr);
}
//获取端口及地址(主机顺序)
USHORT Port() const
{ return ntohs(sin_port); }
//获取IP地址(主机顺序)
ULONG IPAddr() const
{ return ntohl(sin_addr.s_addr); }
//转换及赋值
const CSockAddr& operator=(const SOCKADDR& sa)
{ memcpy(this, &sa, sizeof(SOCKADDR));
return *this; }
const CSockAddr& operator=(const SOCKADDR_IN& sin)
{ memcpy(this, &sin, sizeof(SOCKADDR_IN));
return *this; }
operator SOCKADDR()
{ return *((LPSOCKADDR) this); }
operator LPSOCKADDR()
{ return (LPSOCKADDR) this; }
operator LPSOCKADDR_IN()
{ return (LPSOCKADDR_IN) this; }
};