头文件
struct IPAddress
{
union {
struct IPV4Address
{
ULONG host;
USHORT port;
}address;
UINT64 _64;
};
static IPAddress Zero;
ULONG& GetHost(){
return address.host;}
USHORT& GetPort(){
return address.port;}
ULONG GetHost()const{
return address.host;}
USHORT GetPort()const{
return address.port;}
string ToString()
{
in_addr addr;
addr.S_un.S_addr = address.host;
stringstream ss;
ss << inet_ntoa(addr) << ":" << address.port;
return ss.str();
}
IPAddress(ULONG _host = 0, USHORT _port = 0)
{
_64 = 0;
address.host = _host;
address.port = _port;
}
bool operator < (const IPAddress& _right) const
{
return _64 < _right._64;
}
bool operator != (const IPAddress& _right) const
{
return _64 != _right._64;
}
bool operator == (const IPAddress& _right) const
{
return _64 == _right._64;
}
};
class Socket
{
public:
Socket(int proto = SOCK_STREAM);
Socket(SOCKET s);
virtual ~Socket();
u_long ReceiveLen();
void Close();
protected:
friend class SocketSelect;
SOCKET s_;
int* refCounter_;
static int nofSockets_;
static void Start();
static void End();
};
class TcpClient : public Socket
{
protected:
friend class TcpServer;
bool connected;
TcpClient();
TcpClient(SOCKET s);
public:
int SendBytes(const std::string&);
int Send(void* buf, int len);
int Receive(char* buf, int len);
bool IsConnected(){
return connected;}
string ReceiveBytes();
TcpClient(const TcpClient&);
TcpClient& operator=(TcpClient&);
TcpClient(const std::string& host, int port);
TcpClient(unsigned long host, int port);
};
class UdpSocket : public Socket
{
public:
UdpSocket(unsigned long host, int port);
int SendBytes(const std