From 386196451c45a2b65dd2b2f457d82d6116b2f0de Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Sun, 14 Aug 2011 03:37:20 -0400 Subject: [PATCH] Only server binds -- does this let us roam? --- network.cpp | 20 ++++++++++---------- stm-server.cpp | 1 + stm.cpp | 1 + 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/network.cpp b/network.cpp index d58f107..e7ddb72 100644 --- a/network.cpp +++ b/network.cpp @@ -64,16 +64,6 @@ void Connection::setup( void ) throw NetworkException( "socket", errno ); } - /* Bind to free local port. - This usage does not seem to be endorsed by POSIX. */ - struct sockaddr_in local_addr; - local_addr.sin_family = AF_INET; - local_addr.sin_port = htons( 0 ); - local_addr.sin_addr.s_addr = INADDR_ANY; - if ( bind( sock, (sockaddr *)&local_addr, sizeof( local_addr ) ) < 0 ) { - throw NetworkException( "bind", errno ); - } - /* Enable path MTU discovery */ char flag = IP_PMTUDISC_DO; socklen_t optlen = sizeof( flag ); @@ -99,6 +89,16 @@ Connection::Connection() /* server */ RTTVAR( 500 ) { setup(); + + /* Bind to free local port. + This usage does not seem to be endorsed by POSIX. */ + struct sockaddr_in local_addr; + local_addr.sin_family = AF_INET; + local_addr.sin_port = htons( 0 ); + local_addr.sin_addr.s_addr = INADDR_ANY; + if ( bind( sock, (sockaddr *)&local_addr, sizeof( local_addr ) ) < 0 ) { + throw NetworkException( "bind", errno ); + } } Connection::Connection( const char *key_str, const char *ip, int port ) /* client */ diff --git a/stm-server.cpp b/stm-server.cpp index b998041..9d54bc6 100644 --- a/stm-server.cpp +++ b/stm-server.cpp @@ -208,6 +208,7 @@ void serve( int host_fd ) } } catch ( Network::NetworkException e ) { fprintf( stderr, "%s: %s\r\n", e.function.c_str(), strerror( e.the_errno ) ); + sleep( 1 ); } } } diff --git a/stm.cpp b/stm.cpp index 4b9ba90..5d75f8a 100644 --- a/stm.cpp +++ b/stm.cpp @@ -207,6 +207,7 @@ void client( const char *ip, int port, const char *key ) } } catch ( Network::NetworkException e ) { fprintf( stderr, "%s: %s\r\n", e.function.c_str(), strerror( e.the_errno ) ); + sleep( 1 ); } } }