selectモデル
void CSockTcp::OnRunThreadProc()
{
if(InitTcp())
{
fd_set fdsocket;
FD_ZERO(&fdsocket);
FD_SET(m_sockListen, &fdsocket);
timeval tv;
tv.tv_sec=0;
tv.tv_usec=1000; // 5
char szbuf[MAX_BUFFER_SIZE] = {0};
while(m_bThreadRunFlag)
{
fd_set fdread = fdsocket;
int ret = select(0, &fdread, NULL, NULL, &tv);
if(0==ret) // timeout
{
continue;
}
if(ret > 0)
{
for(int i=0; i<fdsocket.fd_count; i++)
{
if(FD_ISSET(fdsocket.fd_array[i], &fdread))
{
if(fdsocket.fd_array[i] == m_sockListen)
{
if(fdsocket.fd_count < FD_SETSIZE)
{
SOCKADDR_IN addrRemote;
int len = sizeof(SOCKADDR_IN);
SOCKET sockClient = ::accept(fdsocket.fd_array[i], (SOCKADDR*)&addrRemote, &len);
FD_SET(sockClient, &fdsocket);
}
else
{
m_logSys.LogOut(" !");
continue;
}
} // if
else
{
//
ZeroMemory(szbuf,MAX_BUFFER_SIZE);
int nRecv= recv(fdsocket.fd_array[i], szbuf, MAX_BUFFER_SIZE, 0);
if(nRecv > 0)
{
//
szbuf[nRecv]='
';
m_logRun.LogOut(szbuf);
}
if(nRecv == 0 || ( (nRecv == SOCKET_ERROR) && WSAGetLastError() == WSAECONNRESET ))
{
::closesocket(fdsocket.fd_array[i]);
FD_CLR(fdsocket.fd_array[i], &fdsocket);
}
}
}
}
}// if
}//while
FD_ZERO(&fdsocket);
if(INVALID_SOCKET != m_sockListen)
{
::closesocket(m_sockListen);
m_sockListen=INVALID_SOCKET;
}
}
}