ntester just prints out diff
This commit is contained in:
+30
-3
@@ -13,7 +13,8 @@ Transport<MyState, RemoteState>::Transport( MyState &initial_state, RemoteState
|
|||||||
current_state( initial_state ),
|
current_state( initial_state ),
|
||||||
sent_states( 1, TimestampedState<MyState>( timestamp(), 0, initial_state ) ),
|
sent_states( 1, TimestampedState<MyState>( timestamp(), 0, initial_state ) ),
|
||||||
assumed_receiver_state( sent_states.begin() ),
|
assumed_receiver_state( sent_states.begin() ),
|
||||||
received_states( 1, TimestampedState<RemoteState>( timestamp(), 0, initial_remote ) )
|
received_states( 1, TimestampedState<RemoteState>( timestamp(), 0, initial_remote ) ),
|
||||||
|
last_receiver_state( initial_remote )
|
||||||
{
|
{
|
||||||
/* server */
|
/* server */
|
||||||
}
|
}
|
||||||
@@ -26,7 +27,8 @@ Transport<MyState, RemoteState>::Transport( MyState &initial_state, RemoteState
|
|||||||
current_state( initial_state ),
|
current_state( initial_state ),
|
||||||
sent_states( 1, TimestampedState<MyState>( timestamp(), 0, initial_state ) ),
|
sent_states( 1, TimestampedState<MyState>( timestamp(), 0, initial_state ) ),
|
||||||
assumed_receiver_state( sent_states.begin() ),
|
assumed_receiver_state( sent_states.begin() ),
|
||||||
received_states( 1, TimestampedState<RemoteState>( timestamp(), 0, initial_remote ) )
|
received_states( 1, TimestampedState<RemoteState>( timestamp(), 0, initial_remote ) ),
|
||||||
|
last_receiver_state( initial_remote )
|
||||||
{
|
{
|
||||||
/* client */
|
/* client */
|
||||||
}
|
}
|
||||||
@@ -144,7 +146,6 @@ void Transport<MyState, RemoteState>::send_to_receiver( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send instruction */
|
/* send instruction */
|
||||||
/* XXX what about MTU problem? */
|
|
||||||
string s = inst.tostring();
|
string s = inst.tostring();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -225,6 +226,10 @@ void Transport<MyState, RemoteState>::recv( void )
|
|||||||
|
|
||||||
if ( !found ) {
|
if ( !found ) {
|
||||||
// fprintf( stderr, "Ignoring out-of-order packet. Reference state %d has been discarded or hasn't yet been received.\n", int(inst.old_num) );
|
// fprintf( stderr, "Ignoring out-of-order packet. Reference state %d has been discarded or hasn't yet been received.\n", int(inst.old_num) );
|
||||||
|
/* There may be some benefit to storing these diffs until they can be used later,
|
||||||
|
but my guess is that the benefit is slim -- the diffs are likely to be small enough
|
||||||
|
that the entire diff will usually fit in one datagram, and by the time of retransmission
|
||||||
|
the target state will be different anyway. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,3 +287,25 @@ void Transport<MyState, RemoteState>::process_throwaway_until( uint64_t throwawa
|
|||||||
|
|
||||||
assert( received_states.size() > 0 );
|
assert( received_states.size() > 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class MyState, class RemoteState>
|
||||||
|
string Transport<MyState, RemoteState>::get_remote_diff( void )
|
||||||
|
{
|
||||||
|
/* find diff between last receiver state and current remote state, then rationalize states */
|
||||||
|
|
||||||
|
string ret( received_states.back().state.diff_from( last_receiver_state, 1 ) );
|
||||||
|
|
||||||
|
last_receiver_state = received_states.back().state;
|
||||||
|
|
||||||
|
MyState * const oldest_receiver_state = &received_states.front().state;
|
||||||
|
|
||||||
|
last_receiver_state.subtract( oldest_receiver_state );
|
||||||
|
|
||||||
|
for ( typename list< TimestampedState<RemoteState> >::reverse_iterator i = received_states.rbegin();
|
||||||
|
i != received_states.rend();
|
||||||
|
i++ ) {
|
||||||
|
i->state.subtract( oldest_receiver_state );
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|||||||
@@ -76,21 +76,27 @@ namespace Network {
|
|||||||
|
|
||||||
/* simple receiver */
|
/* simple receiver */
|
||||||
list< TimestampedState<RemoteState> > received_states;
|
list< TimestampedState<RemoteState> > received_states;
|
||||||
|
MyState last_receiver_state; /* the state we were in when user last queried state */
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Transport( MyState &initial_state, RemoteState &initial_remote );
|
Transport( MyState &initial_state, RemoteState &initial_remote );
|
||||||
Transport( MyState &initial_state, RemoteState &initial_remote,
|
Transport( MyState &initial_state, RemoteState &initial_remote,
|
||||||
const char *key_str, const char *ip, int port );
|
const char *key_str, const char *ip, int port );
|
||||||
|
|
||||||
|
/* Send data or an ack if necessary.
|
||||||
|
Returns the number of ms to wait until next event. */
|
||||||
int tick( void );
|
int tick( void );
|
||||||
|
|
||||||
|
/* Blocks waiting for a packet. */
|
||||||
void recv( void );
|
void recv( void );
|
||||||
|
|
||||||
int port( void ) { return connection.port(); }
|
int port( void ) { return connection.port(); }
|
||||||
string get_key( void ) { return connection.get_key(); }
|
string get_key( void ) { return connection.get_key(); }
|
||||||
|
|
||||||
MyState &get_current_state( void ) { return current_state; }
|
MyState &get_current_state( void ) { return current_state; }
|
||||||
RemoteState &get_remote_state( void ) { return received_states.back().state; }
|
|
||||||
|
string get_remote_diff( void );
|
||||||
|
|
||||||
uint64_t get_remote_state_num( void ) { return received_states.back().num; }
|
uint64_t get_remote_state_num( void ) { return received_states.back().num; }
|
||||||
|
|
||||||
int fd( void ) { return connection.fd(); }
|
int fd( void ) { return connection.fd(); }
|
||||||
|
|||||||
+1
-6
@@ -52,12 +52,7 @@ int main( int argc, char *argv[] )
|
|||||||
n->recv();
|
n->recv();
|
||||||
|
|
||||||
if ( n->get_remote_state_num() != last_num ) {
|
if ( n->get_remote_state_num() != last_num ) {
|
||||||
fprintf( stderr, "Num: %d. Contents: ",
|
fprintf( stderr, "%s\n", n->get_remote_diff().c_str() );
|
||||||
(int)n->get_remote_state_num() );
|
|
||||||
for ( size_t i = 0; i < n->get_remote_state().user_bytes.size(); i++ ) {
|
|
||||||
fprintf( stderr, "%c", n->get_remote_state().user_bytes[ i ] );
|
|
||||||
}
|
|
||||||
fprintf( stderr, "\n" );
|
|
||||||
last_num = n->get_remote_state_num();
|
last_num = n->get_remote_state_num();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user