Changeset 7146 for trunk/src


Ignore:
Timestamp:
Oct 21, 2001, 3:43:51 PM (24 years ago)
Author:
sandervl
Message:

fixes for sending FD_CLOSE notification when connection is closed at the remote end

Location:
trunk/src/wsock32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wsock32/asyncapi.cpp

    r7140 r7146  
    1 /* $Id: asyncapi.cpp,v 1.17 2001-10-19 18:34:47 achimha Exp $ */
     1/* $Id: asyncapi.cpp,v 1.18 2001-10-21 13:43:51 sandervl Exp $ */
    22
    33/*
     
    407407    ULONG eventReply = WSAMAKESELECTREPLY(event, socket_error);
    408408
     409#ifdef DEBUG
     410    char *pszEvent = NULL;
     411
     412    switch(event) {
     413    case FD_READ:
     414        pszEvent = "FD_READ";
     415        break;
     416    case FD_WRITE:
     417        pszEvent = "FD_WRITE";
     418        break;
     419    case FD_OOB:
     420        pszEvent = "FD_OOB";
     421        break;
     422    case FD_ACCEPT:
     423        pszEvent = "FD_ACCEPT";
     424        break;
     425    case FD_CONNECT:
     426        pszEvent = "FD_CONNECT";
     427        break;
     428    case FD_CLOSE:
     429        pszEvent = "FD_CLOSE";
     430        break;
     431    case FD_QOS:
     432        pszEvent = "FD_QOS";
     433        break;
     434    case FD_GROUP_QOS:
     435        pszEvent = "FD_GROUP_QOS";
     436        break;
     437    case FD_ROUTING_INTERFACE_CHANGE:
     438        pszEvent = "FD_ROUTING_INTERFACE_CHANGE";
     439        break;
     440    case FD_ADDRESS_LIST_CHANGE:
     441        pszEvent = "FD_ADDRESS_LIST_CHANGE";
     442        break;
     443    }
     444#endif
     445
    409446    if (pThreadParm->u.asyncselect.mode == WSA_SELECT_HWND)
    410447    {
    411         dprintf(("AsyncSelectNotifyEvent: notifying window, socket: 0x%x, window handle: 0x%x, window message: 0x%x, event: 0x%x", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, pThreadParm->notifyData, eventReply));
     448        dprintf(("AsyncSelectNotifyEvent: WINDOW, socket: 0x%x, window handle: 0x%x, window message: 0x%x, event: %s (0x%x)", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, pThreadParm->notifyData, pszEvent, eventReply));
    412449        PostMessageA((HWND)pThreadParm->notifyHandle, (DWORD)pThreadParm->notifyData, (WPARAM)pThreadParm->u.asyncselect.s,
    413450                     (LPARAM)eventReply);
     
    416453    if (pThreadParm->u.asyncselect.mode == WSA_SELECT_HEVENT)
    417454    {
    418         dprintf(("AsyncSelectNotifyEvent: notifying event semaphore, socket: 0x%x, HEVENT: 0x%x, event: 0x%x", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, event));
     455        dprintf(("AsyncSelectNotifyEvent: SEM, socket: 0x%x, HEVENT: 0x%x, event: %s (0x%x)", pThreadParm->u.asyncselect.s, pThreadParm->notifyHandle, pszEvent, event));
    419456        // set the event bit in the mask
    420457        pThreadParm->u.asyncselect.lLastEvent |= event;
     
    496533        if(ret == SOCKET_ERROR) {
    497534                int selecterr = sock_errno();
    498                 dprintf2(("WSAsyncSelectThreadProc %x rds=%d, wrs=%d, oos =%d, pending = %x select returned %x", pThreadParm->u.asyncselect.s, noread, nowrite, noexcept, lEventsPending, selecterr));
     535                dprintf(("WSAsyncSelectThreadProc %x rds=%d, wrs=%d, oos =%d, pending = %x select returned %x", pThreadParm->u.asyncselect.s, noread, nowrite, noexcept, lEventsPending, selecterr));
    499536                if(selecterr && selecterr < SOCBASEERR) {
    500537                        selecterr += SOCBASEERR;
     
    591628                        }
    592629                }
    593                 if((lEventsPending & FD_READ) && bytesread >= 0) {
     630                if((lEventsPending & FD_READ) && bytesread > 0) {
    594631                        AsyncSelectNotifyEvent(pThreadParm, FD_READ, NO_ERROR);
    595632                }
    596 #if 0
    597 //SvL: This generates FD_CLOSE messages when the connection is just fine
    598 //     (recv executed in another thread when select returns)
    599633                else
    600                 if((lEventsPending & FD_CLOSE) && (state == 0 && bytesread == 0)) {
    601                         dprintf(("FD_CLOSE; state == 0 && bytesread == 0"));
    602                         AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
    603                 }
    604 #endif
     634                if((lEventsPending & FD_CLOSE) && (state == 0 && bytesread == 0))
     635                {
     636                        state = ioctl(s, FIOBSTATUS, (char *)&tmp, sizeof(tmp));
     637
     638                        //Have to make sure this doesn't generates FD_CLOSE
     639                        //messages when the connection is just fine (recv
     640                        //executed in another thread when select returns)
     641                        if(state & (SS_CANTRCVMORE|SS_CANTSENDMORE|SS_ISDISCONNECTING|SS_ISDISCONNECTED)) {
     642                            dprintf(("FD_CLOSE; state == 0 && bytesread == 0, state = %x", state));
     643                            AsyncSelectNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
     644                        }
     645                }
    605646        }
    606647        if(ready(noexcept))
     
    720761   pThreadParm->u.asyncselect.lLastEvent     = 0;
    721762   // reset all error bits
    722    memset(&pThreadParm->u.asyncselect.iErrorCode, 0, sizeof(int) * FD_MAX_EVENTS);
     763   memset(pThreadParm->u.asyncselect.iErrorCode, 0, sizeof(pThreadParm->u.asyncselect.iErrorCode));
    723764   pThreadParm->u.asyncselect.asyncSem       = new VSemaphore;
    724765   if(pThreadParm->u.asyncselect.asyncSem == NULL) {
  • trunk/src/wsock32/asyncthread.cpp

    r7041 r7146  
    1 /* $Id: asyncthread.cpp,v 1.12 2001-10-13 18:51:07 sandervl Exp $ */
     1/* $Id: asyncthread.cpp,v 1.13 2001-10-21 13:43:51 sandervl Exp $ */
    22
    33/*
     
    4040////    WSASetBlocking(FALSE, pThreadParm->hThread);
    4141
    42   dprintf(("AsyncThread %x exit", pThreadParm->hAsyncTaskHandle));
     42  dprintf(("AsyncThread %x socket %x exit", pThreadParm->hAsyncTaskHandle, pThreadParm->u.asyncselect.s));
    4343  free((PVOID)pThreadParm);
    4444}
     
    4848{
    4949 TID tid;
     50
     51   dprintf(("QueueAsyncJob for socket %x", pThreadParm->u.asyncselect.s));
    5052
    5153   pThreadParm->asyncProc         = asyncproc;
  • trunk/src/wsock32/wsock2.cpp

    r7041 r7146  
    1 /* $Id: wsock2.cpp,v 1.3 2001-10-13 18:51:08 sandervl Exp $ */
     1/* $Id: wsock2.cpp,v 1.4 2001-10-21 13:43:51 sandervl Exp $ */
    22
    33/*
     
    2424int WINAPI WSAEventSelect(SOCKET s, WSAEVENT hEvent, LONG lEvent)
    2525{
    26     TRACE("WS2_32: WSAEventSelect socket 0x%x, hEvent 0x%x, event 0x%x", s, hEvent, (unsigned)lEvent);
     26    dprintf(("WS2_32: WSAEventSelect socket 0x%x, hEvent 0x%x, event 0x%x", s, hEvent, lEvent));
    2727
    2828    // forward call to worker function in HEVENT notification mode
Note: See TracChangeset for help on using the changeset viewer.