【发布时间】: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分离到自己的线程中的答案(正如您所要求的,并声称是您真正需要的)都会破坏它。