- /* Allow rapid reuse of this port. */
- tmp = 1;
- setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
- sizeof (tmp));
+ if (r != 0)
+ {
+ fprintf (stderr, "%s:%s: cannot resolve name: %s\n",
+ parsed.host_str.c_str (), parsed.port_str.c_str (),
+ gai_strerror (r));
+ fflush (stderr);
+ exit (1);
+ }
+
+ scoped_free_addrinfo free_ainfo (ainfo);
+
+ struct addrinfo *p;
+
+ for (p = ainfo; p != NULL; p = p->ai_next)
+ {
+ tmp_desc = socket (p->ai_family, p->ai_socktype, p->ai_protocol);
+
+ if (tmp_desc >= 0)
+ break;
+ }
+
+ if (p == NULL)
+ perror_with_name ("Cannot open socket");
+
+ /* Allow rapid reuse of this port. */
+ tmp = 1;
+ setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
+ sizeof (tmp));
+
+ switch (p->ai_family)
+ {
+ case AF_INET:
+ ((struct sockaddr_in *) p->ai_addr)->sin_addr.s_addr = INADDR_ANY;
+ break;
+ case AF_INET6:
+ ((struct sockaddr_in6 *) p->ai_addr)->sin6_addr = in6addr_any;
+ break;
+ default:
+ fprintf (stderr, "Invalid 'ai_family' %d\n", p->ai_family);
+ exit (1);
+ }