我正在编写一个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 *的std :: list,而MUDControlSocket是作为单例从MUDSocket派生的。
让我知道你是否需要更多的信息,并感谢您的任何帮助。
感谢您的信息。 – 2011-03-30 18:01:47