Ignore:
Timestamp:
Aug 26, 2008 2:41:26 PM (16 years ago)
Author:
bennylp
Message:

Fixed ticket #601: Bug in IoCompletionPort? ioqueue with TCP server socket causes ioqueue to unable to accept incoming TCP connections

File:
1 edited

Legend:

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

    r2155 r2240  
    176176 
    177177    /* Operation complete immediately. */ 
    178     GetAcceptExSockaddrs( accept_overlapped->accept_buf, 
    179                           0,  
    180                           ACCEPT_ADDR_LEN, 
    181                           ACCEPT_ADDR_LEN, 
    182                           &local, 
    183                           &locallen, 
    184                           &remote, 
    185                           &remotelen); 
    186     if (*accept_overlapped->addrlen >= locallen) { 
    187         pj_memcpy(accept_overlapped->local, local, locallen); 
    188         pj_memcpy(accept_overlapped->remote, remote, locallen); 
    189     } else { 
    190         pj_bzero(accept_overlapped->local, *accept_overlapped->addrlen); 
    191         pj_bzero(accept_overlapped->remote, *accept_overlapped->addrlen); 
    192     } 
    193     *accept_overlapped->addrlen = locallen; 
     178    if (accept_overlapped->addrlen) { 
     179        GetAcceptExSockaddrs( accept_overlapped->accept_buf, 
     180                              0,  
     181                              ACCEPT_ADDR_LEN, 
     182                              ACCEPT_ADDR_LEN, 
     183                              &local, 
     184                              &locallen, 
     185                              &remote, 
     186                              &remotelen); 
     187        if (*accept_overlapped->addrlen >= locallen) { 
     188            if (accept_overlapped->local) 
     189                pj_memcpy(accept_overlapped->local, local, locallen); 
     190            if (accept_overlapped->remote) 
     191                pj_memcpy(accept_overlapped->remote, remote, locallen); 
     192        } else { 
     193            if (accept_overlapped->local) 
     194                pj_bzero(accept_overlapped->local,  
     195                         *accept_overlapped->addrlen); 
     196            if (accept_overlapped->remote) 
     197                pj_bzero(accept_overlapped->remote,  
     198                         *accept_overlapped->addrlen); 
     199        } 
     200 
     201        *accept_overlapped->addrlen = locallen; 
     202    } 
    194203    if (accept_overlapped->newsock_ptr) 
    195204        *accept_overlapped->newsock_ptr = accept_overlapped->newsock; 
     
    701710                ioqueue_accept_rec *accept_rec = (ioqueue_accept_rec*)pOv; 
    702711                pj_status_t status = PJ_SUCCESS; 
    703  
    704                 if (accept_rec->newsock == PJ_INVALID_SOCKET) { 
     712                pj_sock_t newsock; 
     713 
     714                newsock = accept_rec->newsock; 
     715                accept_rec->newsock = PJ_INVALID_SOCKET; 
     716 
     717                if (newsock == PJ_INVALID_SOCKET) { 
    705718                    int dwError = WSAGetLastError(); 
    706719                    if (dwError == 0) dwError = OSERR_ENOTCONN; 
     
    708721                } 
    709722 
    710                 key->cb.on_accept_complete(key,  
    711                                            (pj_ioqueue_op_key_t*)pOv,  
    712                                            accept_rec->newsock, 
    713                                            status); 
    714                 accept_rec->newsock = PJ_INVALID_SOCKET; 
     723                key->cb.on_accept_complete(key, (pj_ioqueue_op_key_t*)pOv, 
     724                                           newsock, status); 
     725                 
    715726            } 
    716727            break; 
Note: See TracChangeset for help on using the changeset viewer.