summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerdgeist <>2010-08-15 13:59:08 +0000
committererdgeist <>2010-08-15 13:59:08 +0000
commit4b3189eb44bbb991dc706dc9b5ef9cd9b27a7455 (patch)
tree3da7e473fe68e335655bd69cc2226142aeb7cb13
parent3e30fa32aa1369d2580e9dad593561d007adc0b8 (diff)
Address reconnecting issues
-rw-r--r--proxy.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/proxy.c b/proxy.c
index 7472baa..c65c0b8 100644
--- a/proxy.c
+++ b/proxy.c
@@ -380,22 +380,27 @@ static void handle_read( int64 peersocket ) {
380 380
381 /* The new connection is good, send our tracker_id on incoming connections */ 381 /* The new connection is good, send our tracker_id on incoming connections */
382 if( peer->state == FLAG_CONNECTING ) 382 if( peer->state == FLAG_CONNECTING )
383 io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ); 383 if( io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ) != sizeof( g_tracker_id ) )
384 goto close_socket;
384 385
385 peer->tracker_id = tracker_id; 386 peer->tracker_id = tracker_id;
386 PROXYPEER_SETCONNECTED( peer->state ); 387 PROXYPEER_SETCONNECTED( peer->state );
387 388
388 fprintf( stderr, "Incoming connection successful.\n" ); 389 if( peer->state & FLAG_OUTGOING )
390 fprintf( stderr, "succeeded.\n" );
391 else
392 fprintf( stderr, "Incoming connection successful.\n" );
389 393
390 break; 394 break;
391close_socket: 395close_socket:
396 fprintf( stderr, "Handshake incomplete, closing socket\n" );
392 io_close( peersocket ); 397 io_close( peersocket );
393 reset_info_block( peer ); 398 reset_info_block( peer );
394 break; 399 break;
395 case FLAG_CONNECTED: 400 case FLAG_CONNECTED:
396 /* Here we acutally expect data from peer 401 /* Here we acutally expect data from peer
397 indata_length should be less than 20+256*7 bytes, for incomplete torrent entries */ 402 indata_length should be less than 20+256*7 bytes, for incomplete torrent entries */
398 datalen = io_tryread( peersocket, (void*)(peer->indata + peer->indata_length), sizeof( peer->indata ) - peer->indata_length ); 403 datalen = io_tryread( peersocket, (void*)(peer->indata + peer->indata_length), sizeof( peer->indata ) - peer->indata_length );
399 if( !datalen || datalen < -1 ) { 404 if( !datalen || datalen < -1 ) {
400 fprintf( stderr, "Connection closed by remote peer.\n" ); 405 fprintf( stderr, "Connection closed by remote peer.\n" );
401 io_close( peersocket ); 406 io_close( peersocket );
@@ -432,12 +437,15 @@ static void handle_write( int64 peersocket ) {
432 break; 437 break;
433 } 438 }
434 439
435 io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ); 440 if( io_trywrite( peersocket, (void*)&g_tracker_id, sizeof( g_tracker_id ) ) == sizeof( g_tracker_id ) ) {
436 PROXYPEER_SETWAITTRACKERID( peer->state ); 441 PROXYPEER_SETWAITTRACKERID( peer->state );
437 fprintf( stderr, " succeeded.\n" ); 442 io_dontwantwrite( peersocket );
438 443 io_wantread( peersocket );
439 io_dontwantwrite( peersocket ); 444 } else {
440 io_wantread( peersocket ); 445 fprintf( stderr, "Handshake incomplete, closing socket\n" );
446 io_close( peersocket );
447 reset_info_block( peer );
448 }
441 break; 449 break;
442 case FLAG_CONNECTED: 450 case FLAG_CONNECTED:
443 switch( iob_send( peersocket, &peer->outdata ) ) { 451 switch( iob_send( peersocket, &peer->outdata ) ) {
@@ -612,7 +620,7 @@ static void * streamsync_worker( void * args ) {
612 } 620 }
613 621
614 /* Maximal memory requirement: max 3 blocks, max torrents * 20 + max peers * 7 */ 622 /* Maximal memory requirement: max 3 blocks, max torrents * 20 + max peers * 7 */
615 mem = 3 * ( 4 + 1 + 1 + 2 ) + ( count_one + count_two ) * 19 + count_def * ( 19 + 8 ) + 623 mem = 3 * ( 4 + 1 + 1 + 2 ) + ( count_one + count_two ) * ( 19 + 1 ) + count_def * ( 19 + 8 ) +
616 ( count_one + 2 * count_two + count_peers ) * 7; 624 ( count_one + 2 * count_two + count_peers ) * 7;
617 625
618 fprintf( stderr, "Mem: %zd\n", mem ); 626 fprintf( stderr, "Mem: %zd\n", mem );
@@ -630,7 +638,7 @@ static void * streamsync_worker( void * args ) {
630 ptr_a[7] = count_one & 255; 638 ptr_a[7] = count_one & 255;
631 ptr_a += 8; 639 ptr_a += 8;
632 } else 640 } else
633 count_def += count_one; 641 count_def += count_one;
634 642
635 if( count_two > 8 || !count_def ) { 643 if( count_two > 8 || !count_def ) {
636 mem_b = 4 + 1 + 1 + 2 + count_two * ( 19 + 14 ); 644 mem_b = 4 + 1 + 1 + 2 + count_two * ( 19 + 14 );
@@ -642,7 +650,7 @@ static void * streamsync_worker( void * args ) {
642 ptr_b[7] = count_two & 255; 650 ptr_b[7] = count_two & 255;
643 ptr_b += 8; 651 ptr_b += 8;
644 } else 652 } else
645 count_def += count_two; 653 count_def += count_two;
646 654
647 if( count_def ) { 655 if( count_def ) {
648 memcpy( ptr_c, &g_tracker_id, sizeof(g_tracker_id)); /* Offset 0: the tracker ID */ 656 memcpy( ptr_c, &g_tracker_id, sizeof(g_tracker_id)); /* Offset 0: the tracker ID */
@@ -740,22 +748,23 @@ void livesync_ticker( ) {
740} 748}
741 749
742static void livesync_proxytell( uint8_t prefix, uint8_t *info_hash, uint8_t *peer ) { 750static void livesync_proxytell( uint8_t prefix, uint8_t *info_hash, uint8_t *peer ) {
743 unsigned int i; 751// unsigned int i;
744 752
745 *g_peerbuffer_pos = prefix; 753 *g_peerbuffer_pos = prefix;
746 memcpy( g_peerbuffer_pos + 1, info_hash, sizeof(ot_hash) - 1 ); 754 memcpy( g_peerbuffer_pos + 1, info_hash, sizeof(ot_hash) - 1 );
747 memcpy( g_peerbuffer_pos + sizeof(ot_hash), peer, sizeof(ot_peer) - 1 ); 755 memcpy( g_peerbuffer_pos + sizeof(ot_hash), peer, sizeof(ot_peer) - 1 );
748 756
757#if 0
749 /* Dump info_hash */ 758 /* Dump info_hash */
750 for( i=0; i<sizeof(ot_hash); ++i ) 759 for( i=0; i<sizeof(ot_hash); ++i )
751 printf( "%02X", g_peerbuffer_pos[i] ); 760 printf( "%02X", g_peerbuffer_pos[i] );
752 putchar( ':' ); 761 putchar( ':' );
753 762#endif
754 g_peerbuffer_pos += sizeof(ot_hash); 763 g_peerbuffer_pos += sizeof(ot_hash);
755 764#if 0
756 printf( "%hhu.%hhu.%hhu.%hhu:%hu (%02X %02X)\n", g_peerbuffer_pos[0], g_peerbuffer_pos[1], g_peerbuffer_pos[2], g_peerbuffer_pos[3], 765 printf( "%hhu.%hhu.%hhu.%hhu:%hu (%02X %02X)\n", g_peerbuffer_pos[0], g_peerbuffer_pos[1], g_peerbuffer_pos[2], g_peerbuffer_pos[3],
757 g_peerbuffer_pos[4] | ( g_peerbuffer_pos[5] << 8 ), g_peerbuffer_pos[6], g_peerbuffer_pos[7] ); 766 g_peerbuffer_pos[4] | ( g_peerbuffer_pos[5] << 8 ), g_peerbuffer_pos[6], g_peerbuffer_pos[7] );
758 767#endif
759 g_peerbuffer_pos += sizeof(ot_peer); 768 g_peerbuffer_pos += sizeof(ot_peer);
760 769
761 if( g_peerbuffer_pos >= g_peerbuffer_highwater ) 770 if( g_peerbuffer_pos >= g_peerbuffer_highwater )
@@ -794,10 +803,14 @@ printf( "type: %hhu, prefix: %02X, torrentcount: %zd\n", peer->packet_type, peer
794 do peers |= ( 0x7f & *data ) << ( 7 * shift ); 803 do peers |= ( 0x7f & *data ) << ( 7 * shift );
795 while ( *(data++) & 0x80 && shift++ < 6 ); 804 while ( *(data++) & 0x80 && shift++ < 6 );
796 } 805 }
797 806#if 0
807printf( "peers: %zd\n", peers );
808#endif
798 /* Ensure enough data being read to hold all peers */ 809 /* Ensure enough data being read to hold all peers */
799 if( data + (OT_IP_SIZE + 3) * peers > dataend ) break; 810 if( data + (OT_IP_SIZE + 3) * peers > dataend ) {
800 811 data = hash;
812 break;
813 }
801 while( peers-- ) { 814 while( peers-- ) {
802 livesync_proxytell( peer->packet_tprefix, hash, data ); 815 livesync_proxytell( peer->packet_tprefix, hash, data );
803 data += OT_IP_SIZE + 3; 816 data += OT_IP_SIZE + 3;