summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2009-01-14 20:10:59 +0000
committerMike Buland <eichlan@xagasoft.com>2009-01-14 20:10:59 +0000
commitcad9cf61c1e1c594f69d7e3feb7413caad3bc047 (patch)
tree27eb2d35b38415c73fbd6952b61ddab1d2e9d664
parent3ee5204eb254e914d695a37fede11c8599415fa9 (diff)
downloadlibbu++-cad9cf61c1e1c594f69d7e3feb7413caad3bc047.tar.gz
libbu++-cad9cf61c1e1c594f69d7e3feb7413caad3bc047.tar.bz2
libbu++-cad9cf61c1e1c594f69d7e3feb7413caad3bc047.tar.xz
libbu++-cad9cf61c1e1c594f69d7e3feb7413caad3bc047.zip
Ok...this may work. We completely changed the way Bu::Socket resolves
addresses. Windows wouldn't work with the other way at all. But, fortunately, this seems to work, it does more for us, and it looks pretty cute.
-rw-r--r--src/socket.cpp39
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
41Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) 41Bu::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 )