개인 학습 목적으로 MUD 서버를 쓰고 있습니다. 행복하게 소켓 클래스를 몇 가지 클래스로 마무리하고 모든 것이 올바르게 작동하는 것처럼 보입니다. ; 서버는 연결을 수신하고 받아들이고 현재 클라이언트에서 텍스트를 가져 와서 바로 보냅니다.accept()에 대한 불량 호출 처리에 대한 염려
문제는 WSAEWOULDBLOCK 또는 유효한 소켓 이외의 것을 반환하는 accept() 호출과 관련하여 확실하지 않습니다. 새 소켓을 0으로 재설정하고 반환합니다. 오류가 발생했다는 오류 메시지가 표시 될 수 있습니다. 이것은 현재 내가 현재하고있는 일이며, 20 번 발생하면 추가로 서버를 종료합니다.
void MUDControlSocket::Poll()
{
// create a new connection here
timeval timeout;
FD_ZERO(&ReadSet);
FD_ZERO(&WriteSet);
FD_ZERO(&ExceptionSet);
TopSocket = GetSocket();
NewSocket = 0;
FD_SET(GetSocket(), &ReadSet);
if(SocketList.size() > 0)
{
for(sockIter iter = SocketList.begin(); iter != SocketList.end(); ++iter)
{
FD_SET((*iter)->GetSocket(), &ReadSet);
FD_SET((*iter)->GetSocket(), &WriteSet);
FD_SET((*iter)->GetSocket(), &ExceptionSet);
TopSocket = (*iter)->GetSocket();
}
}
if(select(TopSocket+1, &ReadSet, &WriteSet, &ExceptionSet, &timeout) == SOCKET_ERROR)
{
cout << "Error on select() call: " << SocketErrorType(WSAGetLastError()) << endl;
delete this;
exit(EXIT_FAILURE);
}
// as long as everything is working correctly, this if block should always be entered UNLESS a new connection is accepted
if((NewSocket = accept(GetSocket(), NULL, NULL)) == INVALID_SOCKET)
{
if(WSAGetLastError() == WSAEWOULDBLOCK) // it's not an actual problem. just nothing to connect to yet
return;
NewSocket = 0;
static int count = 0;
cout << "Error on accepting new connection: " << SocketErrorType(WSAGetLastError()) << endl;
if(++count >= 20)
done = true;
return;
}
SocketList.push_back(new MUDSocket(NewSocket)); // only happens if accept DOES NOT return a value of INVALID_SOCKET i.e. a new connection was accepted
TopSocket = NewSocket;
NewSocket = 0;
}
TopSocket 및 NewSocket은 SOCKET 유형이며 파일 범위에 선언되어 있습니다. SocketList는 MUDSocket *의 std :: list이고 MUDControlSocket은 MUDSocket에서 파생됩니다.
더 많은 정보와 도움이 필요하면 알려주세요.
정보를 제공해 주셔서 감사합니다. –