【问题标题】:Accept() in a thread to avoid "blocking" socket线程中的 Accept() 以避免“阻塞”套接字
【发布时间】:2012-10-17 14:37:06
【问题描述】:

我想在单独的线程中处理 accept() 方法,以避免在等待连接时出现一般冻结。

代码(*仅限服务器!*):

int main(int argc, char *argv[])
{
  int sockfd, newsockfd, portno;
  socklen_t clilen;
  char buffer[256];
  struct sockaddr_in serv_addr, cli_addr;
  int n;

  sockfd = socket(AF_INET, SOCK_STREAM, 0);

  bzero((char *) &serv_addr, sizeof(serv_addr));
  portno = atoi(argv[1]);
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(portno);

  bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

  listen(sockfd,5);
  clilen = sizeof(cli_addr);
  newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

  bzero(buffer,256);
  n = read(newsockfd,buffer,255);

  n = write(newsockfd,"Message : ",18);

  close(newsockfd);
  close(sockfd);
  return 0; 
}

如何在这段代码中创建一个单独的线程,防止accept() 调用冻结程序。作为奖励,我想处理多个accept()(因此套接字在收到消息后不会关闭,而是继续侦听并接受请求)。

【问题讨论】:

  • 嗯...在这种情况下,您想要 accept() 阻止其他所有内容。在它返回之前,您没有要读取/写入的客户端套接字。
  • @cHao 不,实际上我希望accept() 在单独的线程中运行,并且在该线程中具有正常行为。
  • 如果 accept 在接受新连接之前不会阻止所有内容,则 newsockfd 无效 - 在您的示例中,它后面的 2/3 行 坏了.
  • @cHao 是的,我在发布之前清理了测试以使代码易于理解。
  • “清理”是指“无效”。该代码不再代表您的问题。事实上,任何涉及将accept 分离到自己的线程中的答案(正如您所要求的,并声称是您真正需要的)都会破坏它。

标签: c++ sockets pthreads


【解决方案1】:

您可以使用 select 来了解是否有可以接受的连接等待,但我的方法是将所有 socket/bind/listen/accept 放在一个线程中,将 accept 放入一个循环中,然后分拆 new到达时带有连接的线程。

【讨论】:

  • 是的,这正是我想要的,但我不知道如何处理 posix 线程...:/
  • 查看这些 API 的手册页...但简而言之,将上面的所有代码放入 Listener 函数...在 main 中使用 pthread_create 启动线程并传递在您的侦听器功能中。在 main 中做一些事情,这样它就不会立即退出(比如等待键盘字符)。接下来,将您的读/写代码放入 Handler 函数中。将 Listener accept 放入循环中,并使用 pthread_create 进行新连接,并将 Handler 和 newsockfd 传递给它。现在您已经拥有了一个多线程连接服务器。
  • 网上有很多 pthreads 教程(google..)。一旦你觉得使用它很舒服,然后尝试在你的服务器中使用它。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多