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;
}