예제 #1
0
		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);
		}
예제 #2
0
    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;
    }