Ignore:
Timestamp:
Mar 24, 2006, 12:18:38 PM (16 years ago)
Author:
titer
Message:

Adds non-blocking (threaded) DNS resolution

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/tracker.c

    r162 r164  
    4242
    4343#define TC_STATUS_IDLE    1
    44 #define TC_STATUS_CONNECT 2
    45 #define TC_STATUS_RECV    4
     44#define TC_STATUS_RESOLVE 2
     45#define TC_STATUS_CONNECT 4
     46#define TC_STATUS_RECV    8
    4647    char           status;
    4748
     49    tr_resolve_t * resolve;
    4850    int            socket;
    4951    uint8_t      * buf;
     
    137139    if( ( tc->status & TC_STATUS_IDLE ) && shouldConnect( tc ) )
    138140    {
    139         struct in_addr addr;
    140 
    141         if( tr_fdSocketWillCreate( tor->fdlimit, 1 ) )
    142         {
    143             return 0;
    144         }
    145 
    146         if( tr_netResolve( inf->trackerAddress, &addr ) )
    147         {
    148             tr_fdSocketClosed( tor->fdlimit, 1 );
    149             return 0;
    150         }
    151 
    152         tc->socket = tr_netOpen( addr, htons( inf->trackerPort ) );
    153         if( tc->socket < 0 )
    154         {
    155             tr_fdSocketClosed( tor->fdlimit, 1 );
    156             return 0;
    157         }
     141        tc->resolve = tr_netResolveInit( inf->trackerAddress );
    158142
    159143        tr_inf( "Tracker: connecting to %s:%d (%s)",
     
    165149                      "getting peers" ) ) ) );
    166150
    167         tc->status  = TC_STATUS_CONNECT;
     151        tc->status  = TC_STATUS_RESOLVE;
    168152        tc->dateTry = tr_date();
     153    }
     154
     155    if( tc->status & TC_STATUS_RESOLVE )
     156    {
     157        int ret;
     158        struct in_addr addr;
     159
     160        ret = tr_netResolvePulse( tc->resolve, &addr );
     161        if( ret == TR_RESOLVE_WAIT )
     162        {
     163            return 0;
     164        }
     165        else
     166        {
     167            tr_netResolveClose( tc->resolve );
     168        }
     169       
     170        if( ret == TR_RESOLVE_ERROR )
     171        {
     172            tc->status = TC_STATUS_IDLE;
     173            return 0;
     174        }
     175
     176        if( tr_fdSocketWillCreate( tor->fdlimit, 1 ) )
     177        {
     178            return 0;
     179        }
     180
     181        tc->socket = tr_netOpen( addr, htons( inf->trackerPort ) );
     182        if( tc->socket < 0 )
     183        {
     184            tr_fdSocketClosed( tor->fdlimit, 1 );
     185            return 0;
     186        }
     187
     188        tc->status = TC_STATUS_CONNECT;
    169189    }
    170190
Note: See TracChangeset for help on using the changeset viewer.