#include "stdafx.h" #include "Acceptor.h" #include "MsWinsockUtil.h" #include "IoHandler.h" #include "Session.h" #include "SessionList.h" #include "RecvBuffer.h" //================================================================================================== /** @remarks ¸®½¼ ¼ÒÄÏÀ» ¿­°í Á¢¼ÓÀ» ó¸®ÇÏ´Â ¿öÄ¿ ¾²·¹µå */ //================================================================================================== unsigned __stdcall accept_thread(LPVOID param) { Acceptor* const acceptor = reinterpret_cast(param); IoHandler* const io_handler = acceptor->io_handler_; DWORD io_size = 0; OVERLAPPEDEX* overlapped = NULL; ULONG_PTR dummy = NULL; BYTE* received_buffer_ptr = NULL; int nLen; SOCKADDR* lpLocalSockaddr = NULL; SOCKADDR* lpRemoteSockaddr = NULL; int nLocalSockaddrLen = 0; int nRemoteSockaddrLen = 0; while (true) { BOOL success = GetQueuedCompletionStatus(acceptor->iocp_handle_, &io_size, &dummy, (LPOVERLAPPED*)&overlapped, INFINITE); // ¾²·¹µå Á¾·á ¸í·ÉÀÌ ³»·ÁÁø °æ¿ì if (dummy == NULL) { break; } if (success == false) { int wsa_error = WSAGetLastError(); if (wsa_error == ERROR_OPERATION_ABORTED) { // NOTE: old comments, ¸®½¼ ¼ÒÄÏÀ» Á¾·á½Ã ±× ¼ÒÄÏ¿¡ AcceptEx °É¾î³õÀº ¼¼¼Çµé¿¡ ´ëÇØ // ERROR_OPERATION_ABORTED ¹ß»ý delete overlapped->session; continue; } else if (wsa_error != ERROR_NETNAME_DELETED) { // AcceptEx¿¡¼­ ERROR_NETNAME_DELETED´Â ¿¡·¯°¡ ¾Æ´Ô(±× ÀÌ¿ÜÀÇ ¿¡·¯´Â continue) continue; } }; //------------------------------------------------------------------------------------------ switch (overlapped->operation_type) { case ACCEPT_POSTED: { RecvBuffer* recv_buffer = overlapped->session->GetRecvBuffer(); recv_buffer->GetRecvParam(&received_buffer_ptr, nLen); // SockAddr ¹Þ¾Æ¿À±â MsWinsockUtil::lpfnGetAcceptExSockAddrs_static_(received_buffer_ptr, 0, sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, &lpLocalSockaddr, &nLocalSockaddrLen, &lpRemoteSockaddr, &nRemoteSockaddrLen); overlapped->session->SetSockAddr((*(SOCKADDR_IN*)lpRemoteSockaddr)); // ÃʱâÈ­¿¡ ¼º°øÇÑ ¼¼¼ÇÀ» PreAcceptedList¿¡ Ãß°¡ÇÑ´Ù. SessionList* session_list = io_handler->accepted_session_list_; session_list->Lock(); session_list->push_back(overlapped->session); session_list->Unlock(); }; break; }; //end 'switch' } return 0; }