我正在使用Linux上的套接字构建服务器,我遇到了一个奇怪的问题:如果我尝试通过浏览器(Chrome)发送请求,我的代码将使用accept创建两个用于通信的套接字。这是接受连接的代码:
server->poll();
if (server->canRead(server))
{
cout << "Connection!" << endl;
newSocket = server->accept(poolSize);
}
以下是使用的函数(它是我为C套接字库编写的包装器的一部分)。
int ServerSocket::poll(int timeout)
{
int rc = ::poll(this->descriptors, this->maxDescriptors, timeout);
if(rc == -1)
throw std::runtime_error(std::string("Error: ") + strerror(errno));
return rc;
}
bool ServerSocket::canRead(Socket *socket)
{
if(socket == NULL)
throw std::invalid_argument(std::string("Error: null socket!"));
for (int i = 0; i < this->maxDescriptors; i++)
{
if (socket->socketDescriptor == this->descriptors[i].fd)
{
if (this->descriptors[i].revents & POLLIN)
return true;
break;
}
}
return false;
}
ClientSocket* ServerSocket::accept(const int poolSize)
{
socklen_t endpointSize = sizeof(this->endpoint);
int newDescriptor = ::accept(this->socketDescriptor,
(struct sockaddr *)&endpoint, &endpointSize);
if(newDescriptor == -1)
throw std::runtime_error(std::string("Error in accept: ") + strerror(errno));
ClientSocket *newSocket = NULL;
try
{
newSocket = new ClientSocket(newDescriptor, this->port, poolSize);
}
catch (std::exception e)
{
std::cout << "Allocation error!" << endl;
throw e;
}
return newSocket;
}
如果我编译并运行此代码,我的输出是:
Connection!
Connection!
我已经使用telnet和netcat来分析浏览器发出的请求,并且没有显示任何异常。我也通过telnet和netcat手动发送请求,服务器工作得很好,没有重复的连接。可能导致这种行为的原因是什么?