int create_sender_sync_socket()

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;
}