ANSC_STATUS AnscDstoCancel ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PANSC_DAEMON_SERVER_TCP_OBJECT pMyObject = (PANSC_DAEMON_SERVER_TCP_OBJECT)hThisObject; PANSC_DSTO_WORKER_OBJECT pWorker = (PANSC_DSTO_WORKER_OBJECT )pMyObject->hWorker; if ( !pMyObject->bActive ) { return ANSC_STATUS_SUCCESS; } else if ( !pWorker ) { return ANSC_STATUS_UNAPPLICABLE; } else { pWorker->Unload(pWorker->hWorkerContext); pMyObject->bActive = FALSE; } if ( ((pMyObject->Socket != XSKT_SOCKET_INVALID_SOCKET) && (pMyObject->Mode & ANSC_DSTO_MODE_XSOCKET)) || ((pMyObject->Socket != ANSC_SOCKET_INVALID_SOCKET) && !(pMyObject->Mode & ANSC_DSTO_MODE_XSOCKET)) ) { if ( pMyObject->Mode & ANSC_DSTO_MODE_POLLING_ACCEPT ) { AnscWaitEvent(&pMyObject->AcceptEvent, ANSC_DSTO_TASK_CLEANUP_TIME); if ( pMyObject->Mode & ANSC_DSTO_MODE_XSOCKET ) { _xskt_shutdown (pMyObject->Socket, XSKT_SOCKET_SD_BOTH); _xskt_closesocket(pMyObject->Socket); } else { _ansc_shutdown (pMyObject->Socket, ANSC_SOCKET_SD_BOTH); _ansc_closesocket(pMyObject->Socket); } } else { if ( pMyObject->Mode & ANSC_DSTO_MODE_XSOCKET ) { _xskt_shutdown (pMyObject->Socket, XSKT_SOCKET_SD_BOTH); _xskt_closesocket(pMyObject->Socket); } else { _ansc_shutdown (pMyObject->Socket, ANSC_SOCKET_SD_BOTH); _ansc_closesocket(pMyObject->Socket); } AnscWaitEvent(&pMyObject->AcceptEvent, ANSC_DSTO_TASK_CLEANUP_TIME); } } pMyObject->StopEngines ((ANSC_HANDLE)pMyObject); pMyObject->DestroyEnginePool((ANSC_HANDLE)pMyObject); pMyObject->DestroySocketPool((ANSC_HANDLE)pMyObject); /* * The underlying socket wrapper may require an explicit cleanup() call, such is the case on * Microsoft windows platforms. The wrapper initialization has to done for each task. On most * real-time operating systems, this call is not required. */ if ( pMyObject->Mode & ANSC_DSTO_MODE_XSOCKET ) { AnscCleanupXsocketWrapper((ANSC_HANDLE)pMyObject); } else { AnscCleanupSocketWrapper((ANSC_HANDLE)pMyObject); } pMyObject->Reset((ANSC_HANDLE)pMyObject); return ANSC_STATUS_SUCCESS; }