Я пишу сервер MUD для личного обучения, и, к счастью, мне удалось объединить сокет в пару классов, и все, кажется, работает правильно;сервер прослушивает и принимает соединения, и в настоящее время принимает текст от клиента и отправляет его обратно.
Дело в том, что я не совсем уверен, что делать с вызовом метода accept (), который возвращает что-то отличное отWSAEWOULDBLOCK или действительный сокет.Должен ли я просто сбросить новый сокет на 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 *, а MUDControlSocket является производным от MUDSocket как синглтон.
Дайте мне знать, если вам нужна дополнительная информация, и спасибо за любую помощь.