服务器端插槽双接受

时间:2015-04-24 13:32:17

标签: c++ sockets server

我正在使用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手动发送请求,服务器工作得很好,没有重复的连接。可能导致这种行为的原因是什么?

0 个答案:

没有答案