void TCPSocket::connect(const IPv4Address &addr, int port){ struct sockaddr_in name; if(_socket == -1) create(); name.sin_family = AF_INET; name.sin_port = htons(port); name.sin_addr = *addr.address(); if(::connect(_socket, (struct sockaddr *)&name, sizeof(name)) != 0){ int erx = errno; close(); _socket = -1; switch(erx){ case ETIMEDOUT: throw ConnectionTimeout(); break; case ECONNREFUSED: throw ConnectionRefused(); break; case ENETUNREACH: throw NetworkUnreachable(); break; default: throw NetworkException(erx); } } in.open(_socket); out.open(_socket); }
NetworkSocket(std::string host, unsigned short int port) : sock(socket(AF_INET, SOCK_STREAM, 0)), buffer(""), temporary_pool(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 8192)), connected(false) { sockaddr_in server; sockaddr_in *sockaddr_ipv4 = 0; addrinfo* result, *ptr; addrinfo hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; if (INVALID_SOCKET == sock) { std::cerr << "Error: couldn't create a socket!\n"; throw NetworkError(); } if (0 != GetAddrInfo(host.c_str(), NULL, &hints, &result)) { std::cerr << "Error: DNS failure (couldn't look up server).\n"; throw NetworkError(); } for(ptr = result; ptr != NULL ; ptr = ptr->ai_next) { if (ptr->ai_family == AF_INET) { CopyMemory(&server, ptr->ai_addr, sizeof(server)); break; } } if (NULL == ptr) { std::cerr << "Error: DNS failure (server not found).\n"; throw NetworkError(); } freeaddrinfo(result); server.sin_family = AF_INET; server.sin_port = htons(port); if (SOCKET_ERROR == connect(sock, (sockaddr*) &server, sizeof(server))) { throw ConnectionRefused(); } connected = true; }