diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/socket.cpp | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/src/socket.cpp b/src/socket.cpp index 77485aa..53b6522 100644 --- a/src/socket.cpp +++ b/src/socket.cpp | |||
| @@ -40,7 +40,6 @@ Bu::Socket::Socket( int nSocket ) : | |||
| 40 | 40 | ||
| 41 | Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) | 41 | Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) |
| 42 | { | 42 | { |
| 43 | struct sockaddr_in xServerName; | ||
| 44 | bActive = false; | 43 | bActive = false; |
| 45 | 44 | ||
| 46 | /* Create the socket. */ | 45 | /* Create the socket. */ |
| @@ -74,27 +73,33 @@ Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) | |||
| 74 | /* Connect to the server. */ | 73 | /* Connect to the server. */ |
| 75 | //printf("Resolving hostname (%s)...\n", sAddr ); | 74 | //printf("Resolving hostname (%s)...\n", sAddr ); |
| 76 | { | 75 | { |
| 77 | struct hostent *hostinfo; | 76 | struct addrinfo *pAddr = NULL; |
| 77 | struct addrinfo aiHints; | ||
| 78 | memset( &aiHints, 0, sizeof(addrinfo) ); | ||
| 79 | aiHints.ai_flags = AI_CANONNAME; | ||
| 80 | aiHints.ai_family = AF_INET; | ||
| 81 | aiHints.ai_socktype = SOCK_STREAM; | ||
| 82 | char ibuf[10]; | ||
| 83 | sprintf( ibuf, "%d", nPort ); | ||
| 78 | 84 | ||
| 79 | xServerName.sin_family = AF_INET; | 85 | if( DYNLOAD getaddrinfo( sAddr.getStr(), ibuf, &aiHints, &pAddr ) |
| 80 | xServerName.sin_port = DYNLOAD htons( nPort ); | 86 | != 0 ) |
| 81 | hostinfo = DYNLOAD gethostbyname( sAddr.getStr() ); | ||
| 82 | if (hostinfo == NULL) | ||
| 83 | { | 87 | { |
| 84 | throw Bu::SocketException("Couldn't resolve hostname.\n"); | 88 | throw Bu::SocketException("Couldn't resolve hostname %s (%s).\n", |
| 89 | sAddr.getStr(), strerror(errno)); | ||
| 85 | } | 90 | } |
| 86 | xServerName.sin_addr = *(struct in_addr *) hostinfo->h_addr; | 91 | |
| 92 | DYNLOAD connect( | ||
| 93 | nSocket, | ||
| 94 | pAddr->ai_addr, | ||
| 95 | pAddr->ai_addrlen | ||
| 96 | ); | ||
| 97 | |||
| 98 | sAddress = pAddr->ai_canonname; | ||
| 99 | |||
| 100 | DYNLOAD freeaddrinfo( pAddr ); | ||
| 87 | } | 101 | } |
| 88 | 102 | ||
| 89 | //printf("Making actual connection..."); | ||
| 90 | //fflush( stdout ); | ||
| 91 | DYNLOAD connect( | ||
| 92 | nSocket, | ||
| 93 | (struct sockaddr *)&xServerName, | ||
| 94 | sizeof(xServerName) | ||
| 95 | ); | ||
| 96 | //printf("Connected.\n"); | ||
| 97 | |||
| 98 | bActive = true; | 103 | bActive = true; |
| 99 | 104 | ||
| 100 | if( nTimeout > 0 ) | 105 | if( nTimeout > 0 ) |
