When not connected, (1) client hops port numbers (2) server stops sending.
This commit is contained in:
@@ -526,7 +526,7 @@ void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network
|
|||||||
|
|
||||||
const int timeout_if_no_client = 60000;
|
const int timeout_if_no_client = 60000;
|
||||||
int timeout = min( network.wait_time(), terminal.wait_time( now ) );
|
int timeout = min( network.wait_time(), terminal.wait_time( now ) );
|
||||||
if ( !network.has_remote_addr() ) {
|
if ( !network.get_remote_state_num() ) {
|
||||||
timeout = min( timeout, timeout_if_no_client );
|
timeout = min( timeout, timeout_if_no_client );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -696,7 +696,7 @@ void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !network.has_remote_addr()
|
if ( !network.get_remote_state_num()
|
||||||
&& time_since_remote_state >= uint64_t( timeout_if_no_client ) ) {
|
&& time_since_remote_state >= uint64_t( timeout_if_no_client ) ) {
|
||||||
fprintf( stderr, "No connection within %d seconds.\n",
|
fprintf( stderr, "No connection within %d seconds.\n",
|
||||||
timeout_if_no_client / 1000 );
|
timeout_if_no_client / 1000 );
|
||||||
|
|||||||
@@ -107,6 +107,20 @@ Packet Connection::new_packet( string &s_payload )
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Connection::reset( void )
|
||||||
|
{
|
||||||
|
if ( server ) {
|
||||||
|
has_remote_addr = false;
|
||||||
|
} else { /* client */
|
||||||
|
if ( close( sock ) < 0 ) {
|
||||||
|
throw NetworkException( "close", errno );
|
||||||
|
}
|
||||||
|
|
||||||
|
setup();
|
||||||
|
last_association = timestamp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Connection::setup( void )
|
void Connection::setup( void )
|
||||||
{
|
{
|
||||||
/* create socket */
|
/* create socket */
|
||||||
@@ -144,6 +158,8 @@ Connection::Connection( const char *desired_ip, const char *desired_port ) /* se
|
|||||||
saved_timestamp( -1 ),
|
saved_timestamp( -1 ),
|
||||||
saved_timestamp_received_at( 0 ),
|
saved_timestamp_received_at( 0 ),
|
||||||
expected_receiver_seq( 0 ),
|
expected_receiver_seq( 0 ),
|
||||||
|
last_heard( -1 ),
|
||||||
|
last_association( -1 ),
|
||||||
RTT_hit( false ),
|
RTT_hit( false ),
|
||||||
SRTT( 1000 ),
|
SRTT( 1000 ),
|
||||||
RTTVAR( 500 ),
|
RTTVAR( 500 ),
|
||||||
@@ -253,6 +269,8 @@ Connection::Connection( const char *key_str, const char *ip, int port ) /* clien
|
|||||||
saved_timestamp( -1 ),
|
saved_timestamp( -1 ),
|
||||||
saved_timestamp_received_at( 0 ),
|
saved_timestamp_received_at( 0 ),
|
||||||
expected_receiver_seq( 0 ),
|
expected_receiver_seq( 0 ),
|
||||||
|
last_heard( -1 ),
|
||||||
|
last_association( -1 ),
|
||||||
RTT_hit( false ),
|
RTT_hit( false ),
|
||||||
SRTT( 1000 ),
|
SRTT( 1000 ),
|
||||||
RTTVAR( 500 ),
|
RTTVAR( 500 ),
|
||||||
@@ -272,6 +290,7 @@ Connection::Connection( const char *key_str, const char *ip, int port ) /* clien
|
|||||||
}
|
}
|
||||||
|
|
||||||
has_remote_addr = true;
|
has_remote_addr = true;
|
||||||
|
last_association = timestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Connection::send( string s )
|
void Connection::send( string s )
|
||||||
@@ -294,6 +313,13 @@ void Connection::send( string s )
|
|||||||
have_send_exception = true;
|
have_send_exception = true;
|
||||||
send_exception = NetworkException( "sendto", errno );
|
send_exception = NetworkException( "sendto", errno );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* association timeout */
|
||||||
|
uint64_t now = timestamp();
|
||||||
|
if ( ( now - last_association > ASSOCIATION_TIMEOUT )
|
||||||
|
&& ( now - last_heard > ASSOCIATION_TIMEOUT ) ) {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string Connection::recv( void )
|
string Connection::recv( void )
|
||||||
@@ -351,6 +377,7 @@ string Connection::recv( void )
|
|||||||
|
|
||||||
/* auto-adjust to remote host */
|
/* auto-adjust to remote host */
|
||||||
has_remote_addr = true;
|
has_remote_addr = true;
|
||||||
|
last_heard = last_association = timestamp();
|
||||||
|
|
||||||
if ( server ) { /* only client can roam */
|
if ( server ) { /* only client can roam */
|
||||||
if ( (remote_addr.sin_addr.s_addr != packet_remote_addr.sin_addr.s_addr)
|
if ( (remote_addr.sin_addr.s_addr != packet_remote_addr.sin_addr.s_addr)
|
||||||
|
|||||||
@@ -91,6 +91,8 @@ namespace Network {
|
|||||||
static const int PORT_RANGE_LOW = 60001;
|
static const int PORT_RANGE_LOW = 60001;
|
||||||
static const int PORT_RANGE_HIGH = 60999;
|
static const int PORT_RANGE_HIGH = 60999;
|
||||||
|
|
||||||
|
static const unsigned int ASSOCIATION_TIMEOUT = 20000; /* ms */
|
||||||
|
|
||||||
static bool try_bind( int socket, uint32_t addr, int port );
|
static bool try_bind( int socket, uint32_t addr, int port );
|
||||||
|
|
||||||
int sock;
|
int sock;
|
||||||
@@ -112,6 +114,8 @@ namespace Network {
|
|||||||
uint64_t saved_timestamp_received_at;
|
uint64_t saved_timestamp_received_at;
|
||||||
uint64_t expected_receiver_seq;
|
uint64_t expected_receiver_seq;
|
||||||
|
|
||||||
|
uint64_t last_heard, last_association;
|
||||||
|
|
||||||
bool RTT_hit;
|
bool RTT_hit;
|
||||||
double SRTT;
|
double SRTT;
|
||||||
double RTTVAR;
|
double RTTVAR;
|
||||||
@@ -123,6 +127,8 @@ namespace Network {
|
|||||||
|
|
||||||
Packet new_packet( string &s_payload );
|
Packet new_packet( string &s_payload );
|
||||||
|
|
||||||
|
void reset( void );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Connection( const char *desired_ip, const char *desired_port ); /* server */
|
Connection( const char *desired_ip, const char *desired_port ); /* server */
|
||||||
Connection( const char *key_str, const char *ip, int port ); /* client */
|
Connection( const char *key_str, const char *ip, int port ); /* client */
|
||||||
|
|||||||
Reference in New Issue
Block a user