[Title] fix bug : fail to multi-vm instance in Windows
authorSon Hyunjun <hj79.son@samsung.com>
Sat, 7 Apr 2012 08:07:31 +0000 (17:07 +0900)
committerSon Hyunjun <hj79.son@samsung.com>
Sat, 7 Apr 2012 08:07:31 +0000 (17:07 +0900)
[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
tizen/src/skin/maruskin_server.c

index 2b5c27dd1c505fc75635aff24cf783db6dafc3de..0ad5b5d4f1f9a3e0e93ef1111adccee3b19c5bcf 100644 (file)
@@ -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 );
 
index 6a378cfc9306c9d00b3bc082cda01e393fb00140..9b1fdc8f9b3da85747e728dca3323cc23e45f3eb 100644 (file)
@@ -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 ) {