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");
}
Beispiel #3
0
void dbFTPDisconnect ( int iFlag )
{
	DisconnectEx ( iFlag );
}
Beispiel #4
0
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() ;
	
}