Changeset 3051


Ignore:
Timestamp:
Jan 8, 2010 1:08:05 PM (14 years ago)
Author:
nanang
Message:

Ticket #1001:

  • Moved setsockopt(SO_UPDATE_ACCEPT_CONTEXT) from pj_sock_accept() to ioqueue_on_accept_complete().
  • Added setsockopt(SO_UPDATE_ACCEPT_CONTEXT) in pj_sock_accept() for new accepted socket when immediate connection is available.
  • Added pj_sock_getsockname() check in unit test ioq_tcp.c for new accepted socket.
Location:
pjproject/trunk/pjlib/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/ioqueue_winnt.c

    r2947 r3051  
    168168 * Process the socket when the overlapped accept() completed. 
    169169 */ 
    170 static void ioqueue_on_accept_complete(ioqueue_accept_rec *accept_overlapped) 
     170static void ioqueue_on_accept_complete(pj_ioqueue_key_t *key, 
     171                                       ioqueue_accept_rec *accept_overlapped) 
    171172{ 
    172173    struct sockaddr *local; 
    173174    struct sockaddr *remote; 
    174175    int locallen, remotelen; 
     176    pj_status_t status; 
    175177 
    176178    PJ_CHECK_STACK(); 
     179 
     180    /* On WinXP or later, use SO_UPDATE_ACCEPT_CONTEXT so that socket  
     181     * addresses can be obtained with getsockname() and getpeername(). 
     182     */ 
     183    status = setsockopt(accept_overlapped->newsock, SOL_SOCKET, 
     184                        SO_UPDATE_ACCEPT_CONTEXT,  
     185                        (char*)&key->hnd,  
     186                        sizeof(SOCKET)); 
     187    /* SO_UPDATE_ACCEPT_CONTEXT is for WinXP or later. 
     188     * So ignore the error status. 
     189     */ 
    177190 
    178191    /* Operation complete immediately. */ 
     
    707720        case PJ_IOQUEUE_OP_ACCEPT: 
    708721            /* special case for accept. */ 
    709             ioqueue_on_accept_complete((ioqueue_accept_rec*)pOv); 
     722            ioqueue_on_accept_complete(key, (ioqueue_accept_rec*)pOv); 
    710723            if (key->cb.on_accept_complete) { 
    711724                ioqueue_accept_rec *accept_rec = (ioqueue_accept_rec*)pOv; 
     
    12121225            int status; 
    12131226 
     1227            /* On WinXP or later, use SO_UPDATE_ACCEPT_CONTEXT so that socket  
     1228             * addresses can be obtained with getsockname() and getpeername(). 
     1229             */ 
     1230            status = setsockopt(sock, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, 
     1231                                (char*)&key->hnd, sizeof(SOCKET)); 
     1232            /* SO_UPDATE_ACCEPT_CONTEXT is for WinXP or later. 
     1233             * So ignore the error status. 
     1234             */ 
     1235 
    12141236            status = getsockname(sock, local, addrlen); 
    12151237            if (status != 0) { 
     
    12401262    if (status != PJ_SUCCESS) 
    12411263        return status; 
    1242  
    1243     /* On WinXP or later, use SO_UPDATE_ACCEPT_CONTEXT so that socket  
    1244      * addresses can be obtained with getsockname() and getpeername(). 
    1245      */ 
    1246     status = setsockopt(op_key_rec->accept.newsock, SOL_SOCKET, 
    1247                         SO_UPDATE_ACCEPT_CONTEXT,  
    1248                         (char*)&key->hnd, sizeof(SOCKET)); 
    1249     /* SO_UPDATE_ACCEPT_CONTEXT is for WinXP or later. 
    1250      * So ignore the error status. 
    1251      */ 
    12521264 
    12531265    op_key_rec->accept.operation = PJ_IOQUEUE_OP_ACCEPT; 
     
    12661278 
    12671279    if (rc == TRUE) { 
    1268         ioqueue_on_accept_complete(&op_key_rec->accept); 
     1280        ioqueue_on_accept_complete(key, &op_key_rec->accept); 
    12691281        return PJ_SUCCESS; 
    12701282    } else { 
  • pjproject/trunk/pjlib/src/pjlib-test/ioq_tcp.c

    r2983 r3051  
    9898        } 
    9999    } else { 
     100        pj_sockaddr addr; 
     101        int client_addr_len; 
     102 
     103        client_addr_len = sizeof(addr); 
     104        status = pj_sock_getsockname(sock, &addr, &client_addr_len); 
     105        if (status != PJ_SUCCESS) { 
     106            app_perror("...ERROR in pj_sock_getsockname()", status); 
     107        } 
     108 
    100109        callback_accept_key = key; 
    101110        callback_accept_op = op_key; 
Note: See TracChangeset for help on using the changeset viewer.