bool IOCP_Manager::StartAcceptLoop() { if (listen(mListenSocket, SOMAXCONN) == SOCKET_ERROR) { printf_s("Listen Error\n"); return false; } while (true) { SOCKET acceptedSock = accept(mListenSocket, NULL, NULL); if (acceptedSock == SOCKET_ERROR) { printf_s("accept : invalid socket\n"); continue; } SOCKADDR_IN clientaddr; int addrlen = sizeof(SOCKADDR_IN); getpeername(acceptedSock, (SOCKADDR*)&clientaddr, &addrlen); ClientSession* client = GSessionManager->CreateClientSession(acceptedSock); if (client->OnConnect(&clientaddr) == false) { client->Disconnect(DisconnectReason::DR_CONNECT_ERROR); GSessionManager->DeleteClientSession(client); } } return true; }
bool IocpManager::StartAcceptLoop() { /// listen if (SOCKET_ERROR == listen(mListenSocket, SOMAXCONN)) return false; /// accept loop while (true) { SOCKET acceptedSock = accept(mListenSocket, NULL, NULL); if (acceptedSock == INVALID_SOCKET) { printf_s("accept: invalid socket\n"); continue; } SOCKADDR_IN clientaddr; int addrlen = sizeof(clientaddr); getpeername(acceptedSock, (SOCKADDR*)&clientaddr, &addrlen); /// 소켓 정보 구조체 할당과 초기화 ClientSession* client = GSessionManager->CreateClientSession(acceptedSock); /// 클라 접속 처리 if (false == client->OnConnect(&clientaddr)) { client->Disconnect(DR_ONCONNECT_ERROR); GSessionManager->DeleteClientSession(client); } } return true; }
unsigned int WINAPI ClientHandlingThread( LPVOID lpParam ) { LThreadType = THREAD_CLIENT ; HANDLE hEvent = (HANDLE)lpParam ; /// Timer HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL) ; if (hTimer == NULL) return -1 ; LARGE_INTEGER liDueTime ; liDueTime.QuadPart = -10000000 ; ///< 1초 후부터 동작 if ( !SetWaitableTimer(hTimer, &liDueTime, 1, TimerProc, NULL, TRUE) ) return -1 ; while ( true ) { /// accept or IO/Timer completion 대기 DWORD result = WaitForSingleObjectEx(hEvent, INFINITE, TRUE) ; /// client connected if ( result == WAIT_OBJECT_0 ) { /// 소켓 정보 구조체 할당과 초기화 ClientSession* client = g_client_manager->CreateClient(g_AcceptedSocket) ; SOCKADDR_IN clientaddr ; int addrlen = sizeof(clientaddr) ; getpeername(g_AcceptedSocket, (SOCKADDR*)&clientaddr, &addrlen) ; // 클라 접속 처리 if ( false == client->OnConnect(&clientaddr) ) { client->Disconnect() ; } continue ; ///< 다시 대기로 } // APC에 있던 completion이 아니라면 에러다 if ( result != WAIT_IO_COMPLETION ) return -1 ; } CloseHandle( hTimer ) ; return 0; }
unsigned int WINAPI ClientHandlingThread( LPVOID lpParam ) { LThreadType = THREAD_CLIENT; PendingAcceptList* pAcceptList = (PendingAcceptList*)lpParam; /// Timer HANDLE hTimer = CreateWaitableTimer( NULL, FALSE, NULL ); if ( hTimer == NULL ) return -1; LARGE_INTEGER liDueTime; liDueTime.QuadPart = -10000000; ///< 1초 후부터 동작 if ( !SetWaitableTimer( hTimer, &liDueTime, 100, TimerProc, NULL, TRUE ) ) return -1; while ( true ) { SOCKET acceptSock = NULL; /// 새로 접속한 클라이언트 처리 if ( pAcceptList->Consume( acceptSock, false ) ) { /// 소켓 정보 구조체 할당과 초기화 ClientSession* client = GClientManager->CreateClient( acceptSock ); SOCKADDR_IN clientaddr; int addrlen = sizeof( clientaddr ); getpeername( acceptSock, (SOCKADDR*)&clientaddr, &addrlen ); // 클라 접속 처리 if ( false == client->OnConnect( &clientaddr ) ) { client->Disconnect(); } continue; ///< 다시 대기로 } /// 최종적으로 클라이언트들에 쌓인 send 요청 처리 GClientManager->FlushClientSend(); /// APC Queue에 쌓인 작업들 처리 SleepEx( INFINITE, TRUE ); } CloseHandle( hTimer ); return 0; }