[UDP-to-HTTP] Use getaddrinfo() to open TCP socket

This commit is contained in:
Matteo Cypriani 2013-09-20 18:45:33 -04:00
parent 75e04cfc17
commit 050026d61f
1 changed files with 37 additions and 13 deletions

View File

@ -27,6 +27,7 @@
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <netdb.h>
#include <assert.h>
@ -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 ;
}