[CRIU] Re: [PATCH] zdtm: If address already in use then need increase port.

Andrew Vagin avagin at parallels.com
Sat Jun 9 10:12:56 EDT 2012


Ack

On Sat, Jun 09, 2012 at 03:24:22PM +0400, vkonyashkin wrote:
> If address already in use then need increase port.
> The problem occured because the socket_listen.c и socket_aio.c
> can try to use the same address.
> ---
>  test/zdtm/live/static/socket_aio.c |   28 ++++++++++++++++++++--------
>  1 files changed, 20 insertions(+), 8 deletions(-)
> 
> diff --git a/test/zdtm/live/static/socket_aio.c b/test/zdtm/live/static/socket_aio.c
> index 9bca45d..9d8675f 100644
> --- a/test/zdtm/live/static/socket_aio.c
> +++ b/test/zdtm/live/static/socket_aio.c
> @@ -20,11 +20,12 @@ const char *test_author = "Andrew Vagin <avagin at parallels.com>";
>  #include <sys/socket.h>
>  #include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */
>  #include <wait.h>
> -#define PORT 8880
> +
> +static int port = 8880;
>  
>  int init_client(char *servIP, unsigned short servPort);
>  int accept_server(int sock);
> -int init_server(int port);
> +int init_server();
>  
>  #define BUF_SIZE 1024
>  
> @@ -40,7 +41,7 @@ int main(int argc, char **argv)
>  
>  	test_init(argc, argv);
>  
> -	if ((fd_s = init_server(PORT)) < 0) {
> +	if ((fd_s = init_server()) < 0) {
>  		err("initializing server failed");
>  		return 1;
>  	}
> @@ -56,7 +57,7 @@ int main(int argc, char **argv)
>  		 * Chiled is client of TCP connection
>  		 */
>  		close(fd_s);
> -		fd = init_client("127.0.0.1", PORT);
> +		fd = init_client("127.0.0.1", port);
>  		if (fd < 0)
>  			return 1;
>  
> @@ -142,21 +143,32 @@ error:
>  	return -1;
>  }
>  
> -int init_server(int port)
> +int init_server()
>  {
>  	struct sockaddr_in addr;
> -	int sock;
> +	int sock, ret;
> +
>  	memset(&addr,0,sizeof(addr));
>  	addr.sin_family = AF_INET;
>  	addr.sin_addr.s_addr = htons(INADDR_ANY);
> -	addr.sin_port = htons(port);
>  	sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
>  	if (sock == -1) {
>  		err ("socket() failed %m");
>  		return -1;
>  	}
>  
> -	if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
> +	while (1) {
> +		addr.sin_port = htons(port);
> +		ret = bind(sock, (struct sockaddr *) &addr, sizeof(addr));
> +		if (ret == -1 && errno == EADDRINUSE) {
> +			test_msg("The port %d is already in use.\n", port);
> +			port++;
> +			continue;
> +		}
> +		break;
> +	}
> +
> +	if (ret == -1) {
>  		err ("bind() failed %m");
>  		return -1;
>  	}
> -- 
> 1.5.2.2
> 



More information about the CRIU mailing list