From 81a9a44cab35e97c39622bee111acfac395b95ba Mon Sep 17 00:00:00 2001 From: Son Hyunjun Date: Sat, 7 Apr 2012 17:07:31 +0900 Subject: [PATCH] [Title] fix bug : fail to multi-vm instance in Windows [Type] Bugfix [Module] Skin [Priority] Major [CQ#] [Redmine#] [Problem] allocating identical skin server port [Cause] SO_REUSEADDR option problem in Windows, rand function without a seed [Solution] remove SO_REUSEADDR option, use OS random port Change-Id: Ibfe70771e75aceb1ad6fd62f10c17b84cb93e9c0 --- tizen/src/skin/maruskin_client.c | 1 + tizen/src/skin/maruskin_server.c | 58 +++++++++++++--------------------------- 2 files changed, 20 insertions(+), 39 deletions(-) diff --git a/tizen/src/skin/maruskin_client.c b/tizen/src/skin/maruskin_client.c index 2b5c27d..0ad5b5d 100644 --- a/tizen/src/skin/maruskin_client.c +++ b/tizen/src/skin/maruskin_client.c @@ -75,6 +75,7 @@ static void* run_skin_client(void* arg) int skin_server_port = get_skin_server_port(); + srand( time( NULL ) ); int uid = rand(); INFO( "generated skin uid:%d\n", uid ); diff --git a/tizen/src/skin/maruskin_server.c b/tizen/src/skin/maruskin_server.c index 6a378cf..9b1fdc8 100644 --- a/tizen/src/skin/maruskin_server.c +++ b/tizen/src/skin/maruskin_server.c @@ -368,58 +368,38 @@ static void parse_skin_args( void ) { static void* run_skin_server( void* args ) { - uint16_t port; - struct sockaddr_in server_addr, client_addr; - socklen_t client_len; + struct sockaddr server_addr, client_addr; + socklen_t server_len, client_len; int shutdown_qmu = 0; - int port_fail_count = 0; INFO("run skin server\n"); - // min:10000 ~ max:(20000 + 10000) - port = rand() % 20001; - port += 10000; - - if ( 0 > ( server_sock = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP ) ) ) { + if ( 0 > ( server_sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) ) { ERR( "create listen socket error\n" ); perror( "create listen socket error : " ); shutdown_qmu = 1; goto cleanup; } - while ( 1 ) { - - memset( &server_addr, '\0', sizeof( server_addr ) ); - - server_addr.sin_family = PF_INET; - server_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); - server_addr.sin_port = htons( port ); - - int opt = 1; - setsockopt( server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof( opt ) ); + memset( &server_addr, '\0', sizeof( server_addr ) ); + ( (struct sockaddr_in *) &server_addr )->sin_family = AF_INET; + memcpy( &( (struct sockaddr_in *) &server_addr )->sin_addr, "\177\000\000\001", 4 ); // 127.0.0.1 + ( (struct sockaddr_in *) &server_addr )->sin_port = htons( 0 ); - if ( 0 > bind( server_sock, (struct sockaddr *) &server_addr, sizeof( server_addr ) ) ) { + server_len = sizeof( server_addr ); - ERR( "skin server bind error\n" ); - perror( "skin server bind error : " ); - port++; - - if ( PORT_RETRY_COUNT < port_fail_count ) { - shutdown_qmu = 1; - goto cleanup; - } else { - port_fail_count++; - INFO( "Retry bind\n" ); - continue; - } + if ( 0 != bind( server_sock, &server_addr, server_len ) ) { + ERR( "skin server bind error\n" ); + perror( "skin server bind error : " ); + shutdown_qmu = 1; + goto cleanup; + } - } else { - svr_port = port; - INFO( "success to bind port[127.0.0.1:%d/tcp] for skin_server in host \n", svr_port ); - break; - } + memset( &server_addr, '\0', sizeof( server_addr ) ); + getsockname( server_sock, (struct sockaddr *) &server_addr, &server_len ); + svr_port = ntohs( ( (struct sockaddr_in *) &server_addr )->sin_port ); - } + INFO( "success to bind port[127.0.0.1:%d/tcp] for skin_server in host \n", svr_port ); if ( 0 > listen( server_sock, 4 ) ) { ERR( "skin_server listen error\n" ); @@ -432,7 +412,7 @@ static void* run_skin_server( void* args ) { char recvbuf[RECV_BUF_SIZE]; - INFO( "skin server start...port:%d\n", port ); + INFO( "skin server start...port:%d\n", svr_port ); while ( 1 ) { -- 2.7.4