diff --git a/owlps-udp-to-http/owlps-udp-to-http.c b/owlps-udp-to-http/owlps-udp-to-http.c index 974ceab..75befea 100644 --- a/owlps-udp-to-http/owlps-udp-to-http.c +++ b/owlps-udp-to-http/owlps-udp-to-http.c @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -297,25 +298,48 @@ void store_result(owl_result *new_result) */ int init_tcp_socket() { - struct sockaddr_in server_addr ; + char http_port_str[6] ; + struct addrinfo + gai_hints, + *gai_results = NULL, + *gai_res = NULL ; + int gai_ret ; // Return value of getaddrinfo() - tcp_sockfd = socket(AF_INET, SOCK_STREAM, 0) ; - if (tcp_sockfd < 0) + /* Get the server information */ + sprintf(http_port_str, "%"PRIuFAST16, options.http_port) ; + memset(&gai_hints, 0, sizeof(struct addrinfo)) ; + gai_hints.ai_family = AF_UNSPEC ; // IPv4 or IPv6 + gai_hints.ai_socktype = SOCK_STREAM ; + gai_hints.ai_flags = AI_PASSIVE ; + gai_ret = getaddrinfo(NULL, http_port_str, &gai_hints, &gai_results) ; + if (gai_ret) { - perror("Error opening the TCP socket") ; + fprintf(stderr, "TCP socket creation failed: getaddrinfo(): %s\n", + gai_strerror(gai_ret)) ; return OWL_ERR_SOCKET_CREATE ; } - memset(&server_addr, 0, sizeof(server_addr)) ; - server_addr.sin_family = AF_INET ; - server_addr.sin_addr.s_addr = INADDR_ANY ; - server_addr.sin_port = htons(options.http_port) ; - - - if (bind(tcp_sockfd, (struct sockaddr *) &server_addr, - sizeof(server_addr)) < 0) + /* Create the TCP socket: + * loop until both socket() and bind() succeed */ + for (gai_res = gai_results ; gai_res != NULL ; + gai_res = gai_res->ai_next) { - perror("Error binding the TCP socket") ; + tcp_sockfd = socket(gai_res->ai_family, gai_res->ai_socktype, + gai_res->ai_protocol) ; + if (tcp_sockfd == -1) + continue ; + + if (! bind(tcp_sockfd, gai_res->ai_addr, gai_res->ai_addrlen)) + break ; // Success! + + close(tcp_sockfd) ; + tcp_sockfd = -1 ; + } + + if (gai_res == NULL) + { + fprintf(stderr, + "TCP socket creation failed: socket() or bind().\n") ; return OWL_ERR_SOCKET_CREATE ; }