in src/endpointsync.c [12:97]
int create_sender_sync_socket(struct ntttcp_test_endpoint *tep)
{
char *log = NULL;
int sockfd = 0; /* socket id */
struct ntttcp_test *test = tep->test;
struct sockaddr_storage local_addr; /* for local address */
socklen_t local_addr_size; /* local address size, for getsockname(), to get local port */
char *ip_address_str; /* used to get remote peer's ip address */
int ip_address_max_size; /* used to get remote peer's ip address */
int sync_port = 0;
char *port_str; /* to get remote peer's port number for getaddrinfo() */
struct addrinfo hints, *serv_info, *p; /* to get remote peer's sockaddr for connect() */
int i = 0;
sync_port = test->server_base_port - 1;
ip_address_max_size = (test->domain == AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN);
if ((ip_address_str = (char *)malloc(ip_address_max_size)) == (char *)NULL) {
PRINT_ERR("cannot allocate memory for ip address string");
freeaddrinfo(serv_info);
return 0;
}
/* connect to remote receiver */
memset(&hints, 0, sizeof hints);
hints.ai_family = test->domain;
hints.ai_socktype = TCP;
ASPRINTF(&port_str, "%d", sync_port);
if (getaddrinfo(test->bind_address, port_str, &hints, &serv_info) != 0) {
PRINT_ERR("cannot get address info for receiver");
free(port_str);
return 0;
}
free(port_str);
/* only get the first entry to connect */
for (p = serv_info; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
PRINT_ERR("cannot create socket endpoint");
freeaddrinfo(serv_info);
free(ip_address_str);
return 0;
}
ip_address_str = retrive_ip_address_str((struct sockaddr_storage *)p->ai_addr, ip_address_str, ip_address_max_size);
if ((i = connect(sockfd, p->ai_addr, p->ai_addrlen)) < 0) {
if (i == -1) {
ASPRINTF(&log,
"failed to connect to receiver: %s:%d on socket: %d. errno = %d",
ip_address_str, sync_port, sockfd, errno);
PRINT_ERR_FREE(log);
} else {
ASPRINTF(&log,
"failed to connect to receiver: %s:%d on socket: %d. error code = %d",
ip_address_str, sync_port, sockfd, i);
PRINT_ERR_FREE(log);
}
freeaddrinfo(serv_info);
free(ip_address_str);
close(sockfd);
return 0;
} else {
break; /* connected */
}
}
/* get local port number */
local_addr_size = sizeof(local_addr);
if (getsockname(sockfd, (struct sockaddr *)&local_addr, &local_addr_size) != 0) {
ASPRINTF(&log, "failed to get local address information for socket: %d", sockfd);
PRINT_ERR_FREE(log);
}
ASPRINTF(&log,
"Sync connection: local:%d [socket:%d] --> %s:%d",
ntohs(test->domain == AF_INET ?
((struct sockaddr_in *)&local_addr)->sin_port :
((struct sockaddr_in6 *)&local_addr)->sin6_port),
sockfd, ip_address_str, sync_port);
PRINT_DBG_FREE(log);
free(ip_address_str);
freeaddrinfo(serv_info);
return sockfd;
}