Changeset 3171


Ignore:
Timestamp:
Sep 25, 2007, 11:10:34 PM (15 years ago)
Author:
charles
Message:
  • record the ports of incoming sockets. we might need them later if we want to disconnect and reconnect.
  • for portability, use libevent API for some socket upkeep
Location:
trunk/libtransmission
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/fdlimit.c

    r3105 r3171  
    2323 *****************************************************************************/
    2424
     25#include <assert.h>
    2526#include <errno.h>
    2627#include <stdio.h>
     
    3233#include <unistd.h>
    3334#include <fcntl.h>
     35
     36#include <evutil.h>
    3437
    3538#include "transmission.h"
     
    115118    {
    116119#ifdef BEOS_NETSERVER
    117             closesocket( s[j] );
     120        closesocket( s[j] );
    118121#else
    119             close( s[j] );
     122        EVUTIL_CLOSESOCKET( s[j] );
    120123#endif
    121124    }
     
    356359}
    357360
    358 int tr_fdSocketAccept( int b, struct in_addr * addr, tr_port_t * port )
     361int
     362tr_fdSocketAccept( int b, struct in_addr * addr, tr_port_t * port )
    359363{
    360364    int s = -1;
     
    362366    struct sockaddr_in sock;
    363367
     368    assert( addr != NULL );
     369    assert( port != NULL );
     370
    364371    tr_lockLock( gFd->lock );
    365372    if( gFd->normal < gFd->normalMax )
     
    371378    {
    372379        SocketSetPriority( s, 0 );
    373         if( NULL != addr )
    374         {
    375             *addr = sock.sin_addr;
    376         }
    377         if( NULL != port )
    378         {
    379             *port = sock.sin_port;
    380         }
     380        *addr = sock.sin_addr;
     381        *port = sock.sin_port;
    381382        gFd->normal++;
    382383    }
     
    397398        closesocket( s );
    398399#else
    399         close( s );
     400        EVUTIL_CLOSESOCKET( s );
    400401#endif
    401402        if( SocketGetPriority( s ) )
  • trunk/libtransmission/net.c

    r3105 r3171  
    3535#endif
    3636
     37#include <evutil.h>
     38
    3739#include "transmission.h"
    3840#include "fdlimit.h"
     
    7476 **********************************************************************/
    7577
    76 static int makeSocketNonBlocking( int s )
    77 {
    78 #ifdef WIN32
    79     unsigned long flags = 1;
    80     if( ioctlsocket( s, FIONBIO, &flags) == SOCKET_ERROR )
    81 #elif defined(__BEOS__)
    82     int flags = 1;
    83     if( setsockopt( s, SOL_SOCKET, SO_NONBLOCK,
    84                     &flags, sizeof( int ) ) < 0 )
     78static int
     79makeSocketNonBlocking( int fd )
     80{
     81    if( fd >= 0 )
     82    {
     83#if defined(__BEOS__)
     84        int flags = 1;
     85        if( setsockopt( fd, SOL_SOCKET, SO_NONBLOCK,
     86                        &flags, sizeof( int ) ) < 0 )
    8587#else
    86     int flags = 1;
    87     if( ( flags = fcntl( s, F_GETFL, 0 ) ) < 0 ||
    88         fcntl( s, F_SETFL, flags | O_NONBLOCK ) < 0 )
    89 #endif
    90     {
    91         tr_err( "Couldn't set socket to non-blocking mode (%s)",
    92                 strerror( sockerrno ) );
    93         tr_netClose( s );
    94         return -1;
    95     }
    96 
    97     return s;
    98 }
    99 
    100 static int createSocket( int type, int priority )
    101 {
    102     int s;
    103     if( ( s = tr_fdSocketCreate( type, priority ) ) < 0 )
    104     {
    105         return -1;
    106     }
    107     return makeSocketNonBlocking( s );
     88        if( evutil_make_socket_nonblocking( fd ) )
     89#endif
     90        {
     91            tr_err( "Couldn't set socket to non-blocking mode (%s)",
     92                    strerror( sockerrno ) );
     93            tr_netClose( fd );
     94            fd = -1;
     95        }
     96    }
     97
     98    return fd;
     99}
     100
     101static int
     102createSocket( int type, int priority )
     103{
     104    return makeSocketNonBlocking( tr_fdSocketCreate( type, priority ) );
    108105}
    109106
     
    239236
    240237
    241 int tr_netAccept( int b, struct in_addr * addr, tr_port_t * port )
    242 {
    243     int s;
    244     if( ( s = tr_fdSocketAccept( b, addr, port ) ) < 0 )
    245     {
    246         return -1;
    247     }
    248     return makeSocketNonBlocking( s );
     238int
     239tr_netAccept( int b, struct in_addr * addr, tr_port_t * port )
     240{
     241    return makeSocketNonBlocking( tr_fdSocketAccept( b, addr, port ) );
    249242}
    250243
  • trunk/libtransmission/peer-io.c

    r3142 r3171  
    107107**/
    108108
    109 //static int total_io = 0;
    110 
    111109static tr_peerIo*
    112110tr_peerIoNew( struct tr_handle  * handle,
    113111              struct in_addr    * in_addr,
     112              uint16_t            port,
    114113              const uint8_t     * torrentHash,
    115114              int                 isIncoming,
     
    121120    c->handle = handle;
    122121    c->in_addr = *in_addr;
     122    c->port = port;
    123123    c->socket = socket;
    124124    c->rateToPeer = tr_rcInit( );
     
    137137tr_peerIoNewIncoming( struct tr_handle  * handle,
    138138                      struct in_addr    * in_addr,
     139                      uint16_t            port,
    139140                      int                 socket )
    140141{
    141     tr_peerIo * c;
    142 
    143142    assert( handle != NULL );
    144143    assert( in_addr != NULL );
    145144    assert( socket >= 0 );
    146145
    147     c = tr_peerIoNew( handle, in_addr, NULL, 1, socket );
    148     c->port = -1;
    149     return c;
     146    return tr_peerIoNew( handle, in_addr, port,
     147                         NULL, 1,
     148                         socket );
    150149}
    151150
     
    156155                      const uint8_t     * torrentHash )
    157156{
    158     tr_peerIo * c;
    159 
    160157    assert( handle != NULL );
    161158    assert( in_addr != NULL );
     
    163160    assert( torrentHash != NULL );
    164161
    165     c = tr_peerIoNew( handle, in_addr, torrentHash, 0,
    166                       tr_netOpenTCP( in_addr, port, 0 ) );
    167     c->port = port;
    168     return c;
     162    return tr_peerIoNew( handle, in_addr, port,
     163                         torrentHash, 0,
     164                         tr_netOpenTCP( in_addr, port, 0 ) );
    169165}
    170166
  • trunk/libtransmission/peer-io.h

    r3122 r3171  
    3939      tr_peerIoNewIncoming( struct tr_handle   * handle,
    4040                            struct in_addr     * addr,
     41                            uint16_t             port,
    4142                            int                  socket );
    4243
  • trunk/libtransmission/peer-mgr.c

    r3170 r3171  
    763763tr_peerMgrAddIncoming( tr_peerMgr      * manager,
    764764                       struct in_addr  * addr,
     765                       uint16_t          port,
    765766                       int               socket )
    766767{
    767768    if( getExistingHandshake( manager, addr ) == NULL )
    768769    {
    769         tr_peerIo * io = tr_peerIoNewIncoming( manager->handle, addr, socket );
     770        tr_peerIo * io = tr_peerIoNewIncoming( manager->handle, addr, port, socket );
    770771        initiateHandshake( manager, io );
    771772    }
  • trunk/libtransmission/peer-mgr.h

    r3105 r3171  
    4141void tr_peerMgrAddIncoming( tr_peerMgr      * manager,
    4242                            struct in_addr  * addr,
     43                            uint16_t          port,
    4344                            int               socket );
    4445
  • trunk/libtransmission/shared.c

    r3165 r3171  
    281281    {
    282282        int socket;
     283        uint16_t port;
    283284        struct in_addr addr;
    284285
     
    286287            break;
    287288
    288         socket = tr_netAccept( s->bindSocket, &addr, NULL );
     289        socket = tr_netAccept( s->bindSocket, &addr, &port );
    289290        if( socket < 0 )
    290291            break;
    291292
    292         tr_peerMgrAddIncoming( s->h->peerMgr, &addr, socket );
    293     }
    294 }
     293        tr_peerMgrAddIncoming( s->h->peerMgr, &addr, port, socket );
     294    }
     295}
Note: See TracChangeset for help on using the changeset viewer.