void Session::DisconnectRequest(DisconnectReason dr) { /// 이미 끊겼거나 끊기는 중이거나 if (0 == InterlockedExchange(&mConnected, 0)) return; OverlappedDisconnectContext* context = new OverlappedDisconnectContext(this, dr); if (FALSE == DisconnectEx(mSocket, (LPWSAOVERLAPPED)context, TF_REUSE_SOCKET, 0)) { if (WSAGetLastError() != WSA_IO_PENDING) { DeleteIoContext(context); printf_s("Session::DisconnectRequest Error : %d\n", GetLastError()); } } }
VOID CALLBACK workerIoThreadProc(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PVOID Overlapped, ULONG IoResult, ULONG_PTR NumberOfBytesTransferred, PTP_IO Io) { ods("workerIoThreadProc start\n"); BOOL success; LPOVERLAPPED_ACCEPT ola=(LPOVERLAPPED_ACCEPT)Overlapped; if(OAS_RECV==ola->oas){ ods("OAS_RECV\n"); DWORD numWritten=0; SecureZeroMemory(Overlapped, sizeof(OVERLAPPED)); DWORD sizeofSend=sizeof(status200HelloWorld)-1; CopyMemory(ola->acceptBuf, status200HelloWorld, sizeofSend); ola->oas=OAS_SEND; StartThreadpoolIo(Io); success=WriteFile((HANDLE)ola->s, ola->acceptBuf, sizeofSend, &numWritten, &ola->overlapped); if(!success && GetLastError()!=ERROR_IO_PENDING){ int wsaError=WSAGetLastError(); DebugBreak(); } }else if(OAS_SEND==ola->oas){ ods("OAS_SEND\n"); SecureZeroMemory(Overlapped, sizeof(OVERLAPPED)); ola->oas=OAS_CLOSE; StartThreadpoolIo(Io); success=DisconnectEx(ola->s, &ola->overlapped, TF_REUSE_SOCKET, 0); if(!success && GetLastError()!=ERROR_IO_PENDING){ int wsaError=WSAGetLastError(); DebugBreak(); } }else if(OAS_CLOSE==ola->oas){ ods("OAS_CLOSE\n"); DWORD acceptBufSize=max(0, ola->bufSize-sizeof(sockaddr_in)-16-sizeof(sockaddr_in)-16); acceptBufSize=0; StartThreadpoolIo(pListen); success=AcceptEx(sListen, ola->s, ola->acceptBuf, acceptBufSize, sizeof(sockaddr_in)+16, sizeof(sockaddr_in)+16, 0, &ola->overlapped); if(!success && WSAGetLastError()!=ERROR_IO_PENDING){ DebugBreak(); } }else{ DebugBreak(); } ods("workerIoThreadProc return\n"); }
void dbFTPDisconnect ( int iFlag ) { DisconnectEx ( iFlag ); }
void CServerSocket::DisconnectForReuse( CSocketBuffer * pBuffer ) { if( pBuffer == NULL ) return ; pool_lock() ; try{ if( pBuffer->m_bAccepted /*bAccepted*/ ) { COV_UNIT * pOV ; m_sendSlot.Get_SendUnit( &pOV, 1 ) ; pOV->SetOperation( mode_close_socket ) ; pBuffer->Shutdown( SD_BOTH ) ; //printf( "in DisconnetForReuse\n" ) ; if( pDisconnectEx ) { if( !DisconnectEx( pBuffer, static_cast<LPOVERLAPPED>(pOV), TF_REUSE_SOCKET ) ) { DWORD lastError = ::WSAGetLastError() ; if( ERROR_IO_PENDING != lastError ) { ::PrintConsole( "Error Disconnect : %d\n", lastError ) ; // 이건 어떻게 하나.. } } else { m_iocp.PostStatus( pBuffer->socket, 0, static_cast<LPOVERLAPPED>(pOV) ) ; } } else { if( !TransmitFile( pBuffer, static_cast<LPOVERLAPPED>(pOV) ) ) { DWORD lastError = ::WSAGetLastError() ; if( ERROR_IO_PENDING != lastError ) { ::PrintConsole( "Error Disconnect : %d\n", lastError ) ; // 이건 어떻게 하나.. } } else { m_iocp.PostStatus( pBuffer->socket, 0, static_cast<LPOVERLAPPED>(pOV) ) ; } } } else { } pBuffer->m_bAccepted = false ; } catch (...) { ::PrintConsole("[EXCEPTION] %s, %d \n", __FILE__, __LINE__ ) ; } pool_unlock() ; }