18,363
社区成员




- DWORD WINAPI CServer::worker_thread(LPVOID server)
- {
- CServer* m_server=(CServer*)server;
- DWORD bytes=0;
- overlapped_wrapper* over_type;
- BOOL close_socket = false;
- DWORD last_error =0;
- BOOL ret;
- while (true)
- {
- SOCKET socket;
- ret = GetQueuedCompletionStatus(m_server->completion_port_, &bytes,(LPDWORD)&socket, (LPOVERLAPPED *) &over_type, INFINITE);
- if(ret == ERROR_SUCCESS)
- {
- DWORD last_error = GetLastError();
- if(ERROR_INVALID_HANDLE == last_error)
- {
- ConsoleOutput("Completion port be erro quit! GetLastErro:%d\n",GetLastError());
- return 0;
- }
- else if(ERROR_NETNAME_DELETED == last_error|| ERROR_OPERATION_ABORTED == last_error)
- {
- //ConsoleOutput("socket be closed or operation be cancled.GetLastErro:%d\n",GetLastError());
- close_socket = true;
- }
- else
- {
- ConsoleOutput("GetQueuedCompletionStatus erro! GetLastErro:%d\n",GetLastError());
- continue;
- }
- }
- //quit
- else if(bytes == 0 && socket == 0 && over_type == NULL)
- {
- ConsoleOutput("GetQueuedCompletionStatus be normal quit. GetLastErro:%d\n",GetLastError());
- return 0;
- }
- assert(over_type);
- switch(over_type->io_type)
- {
- case IO_EVENT_ACCEPT:
- {
- acceptex_block* a_block = (acceptex_block*)over_type;
- //1.accept failed ,then post a new accept request.
- //2.accept success,then post a new accept request.
- if(close_socket)
- {
- m_server->on_tcp_listen_close(a_block);
- }
- else
- {
- m_server->on_acceptex(a_block);
- }
- }
- break;
- case IO_EVENT_WSARECV:
- {
- recv_block* r_block = (recv_block*)over_type;
- //closed
- if (close_socket || bytes == 0 || bytes == -1)
- {
- //try one time,confirm it was true closed.
- char test_close;
- int r = 0;//recv(r_block->socket, &test_close, sizeof(test_close), MSG_PEEK);
- if(r == 0 || r == SOCKET_ERROR)
- {
- m_server->on_tcp_close((data_block*)r_block);
- }
- }
- //recved data
- else
- {
- //process data
- r_block->bytes_recveived += bytes;
- m_server->on_recv(r_block);
- }
- }
- break;
- case IO_EVENT_WSASEND:
- {
- send_block* s_block = (send_block*)over_type;
- //closed
- if (close_socket || bytes == 0 || bytes == -1)
- {
- //try one time,confirm it was true closed.
- char test_close;
- int r = 0;//send(s_block->socket, &test_close, sizeof(test_close), MSG_PEEK);
- if(r == 0 || r == SOCKET_ERROR)
- {
- m_server->on_tcp_close((data_block*)s_block);
- }
- }
- //send data
- else
- {
- //process data
- s_block->bytes_sended += bytes;
- m_server->on_send(s_block);
- }
- }
- break;
- default:
- ConsoleOutput("worker thread default break;");
- break;
- }
- close_socket=false;
- last_error=0;
- }
- return 0;
- }