#include "socket.h" #include #include #include // Debug print options #define DP 0 //#define DPS " " #define DPS "" bool g_sockets_initialized = false; void sockets_init() { #ifdef _WIN32 WSADATA WsaData; if(WSAStartup( MAKEWORD(2,2), &WsaData ) != NO_ERROR) throw SocketException("WSAStartup failed"); #else #endif g_sockets_initialized = true; } void sockets_cleanup() { #ifdef _WIN32 WSACleanup(); #endif } Address::Address() { } Address::Address(unsigned int address, unsigned short port) { m_address = address; m_port = port; } Address::Address(unsigned int a, unsigned int b, unsigned int c, unsigned int d, unsigned short port) { m_address = (a<<24) | (b<<16) | ( c<<8) | d; m_port = port; } bool Address::operator==(Address &address) { return (m_address == address.m_address && m_port == address.m_port); } void Address::Resolve(const char *name) { struct addrinfo *resolved; int e = getaddrinfo(name, NULL, NULL, &resolved); if(e != 0) throw ResolveError(""); /* FIXME: This is an ugly hack; change the whole class to store the address as sockaddr */ struct sockaddr_in *t = (struct sockaddr_in*)resolved->ai_addr; m_address = ntohl(t->sin_addr.s_addr); freeaddrinfo(resolved); } unsigned int Address::getAddress() const { return m_address; } unsigned short Address::getPort() const { return m_port; } void Address::setAddress(unsigned int address) { m_address = address; } void Address::setPort(unsigned short port) { m_port = port; } void Address::print() const { std::cout<<((m_address>>24)&0xff)<<"." <<((m_address>>16)&0xff)<<"." <<((m_address>>8)&0xff)<<"." <<((m_address>>0)&0xff)<<":" < "; destination.print(); std::cout<<", size="<20) std::cout<<"..."; if(dumping_packet) std::cout<<" (DUMPED BY INTERNET_SIMULATOR)"; std::cout<20) std::cout<<"..."; std::cout<