@@ -9,6 +9,7 @@ typedef SSIZE_T ssize_t;
9
9
#include < netinet/tcp.h>
10
10
#include < arpa/inet.h>
11
11
#include < unistd.h>
12
+ #include < netdb.h> // for getaddrinfo
12
13
#endif
13
14
#include " nn-network.hpp"
14
15
#include < cassert>
@@ -141,17 +142,33 @@ static void writeAckPacket(int socket) {
141
142
}
142
143
143
144
static inline int connectSocket (char *host, int port) {
144
- struct sockaddr_in addr;
145
- memset (&addr, 0 , sizeof (addr));
146
- addr.sin_family = AF_INET;
147
- addr.sin_addr .s_addr = inet_addr (host);
148
- addr.sin_port = htons (port);
145
+
146
+ int sd, err;
147
+ struct addrinfo hints = {}, *addrs;
148
+ char port_str[16 ] = {};
149
+ sprintf (port_str, " %d" , port);
150
+
151
+ hints.ai_family = AF_INET;
152
+ hints.ai_socktype = SOCK_STREAM;
153
+ hints.ai_protocol = IPPROTO_TCP;
154
+ err = getaddrinfo (host, port_str, &hints, &addrs);
155
+ if (err != 0 ){
156
+ fprintf (stderr, " %s: %s\n " , host, gai_strerror (err));
157
+ abort ();
158
+ }
159
+
160
+ struct addrinfo *addr = addrs;
161
+ if (addr == NULL ){
162
+ fprintf (stderr, " %s: %s\n " , host, " addresses were null" );
163
+ abort ();
164
+ }
165
+
166
+ int sock = ::socket (addr->ai_family , addr->ai_socktype , addr->ai_protocol );
149
167
150
- int sock = ::socket (AF_INET, SOCK_STREAM, 0 );
151
168
if (sock < 0 )
152
169
throw std::runtime_error (" Cannot create socket" );
153
170
154
- int connectResult = ::connect (sock, ( struct sockaddr *)& addr, sizeof ( addr) );
171
+ int connectResult = ::connect (sock, addr-> ai_addr , addr-> ai_addrlen );
155
172
if (connectResult != 0 ) {
156
173
printf (" Cannot connect to %s:%d (%s)\n " , host, port, SOCKET_LAST_ERROR);
157
174
throw std::runtime_error (" Cannot connect" );
0 commit comments