tcp nonblocking无效

时间:2017-10-11 13:20:24

标签: c++ tcp

我有一个tcp服务器和2个想要连接它的客户端。这个客户端连接的方式是其中一个,让我们称之为client1将始终连接发送数据,而另一个client2将最终连接,发送少量数据并断开连接。我设置了O_NONBLOCK选项。我遇到的行为是,在服务器端连续发送数据的客户端收到一条消息并等待下一个连接...这是我到目前为止所尝试的(代码是在任何时刻{{{ 1}}想要连接和发送数据并断开连接):

client2

我还尝试在while内添加选项,并在fcntl(sockfd, F_SETFL, O_NONBLOCK); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd, 5); clilen = sizeof(cli_addr); int flag = 0; do { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if(newsockfd > 0){ //Sockets Layer Call: inet_ntop() inet_ntop(AF_INET6, &(cli_addr.sin6_addr),client_addr_ipv6, 100); printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6); n = recv(newsockfd, buffer, 49,0); if(n > 0){ send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer); memset(buffer,0,sizeof(buffer)); } } newsockfd2 = accept(sockfd, (struct sockaddr *) &cli_addr2, &clilen); //Sockets Layer Call: inet_ntop() if(newsockfd2 > 0){ inet_ntop(AF_INET6, &(cli_addr2.sin6_addr),client_addr_ipv6, 100); printf("Incoming connection from client having IPv6 address: %s\n",client_addr_ipv6); n2= recv(newsockfd2, buffer, 49, 0); if(n2 > 0){ send_data(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6],buffer); memset(buffer,0,sizeof(buffer)); } } }while(!flag); newsockfd上设置非阻止,但结果相同。

我做错了什么?谢谢 ! :d

1 个答案:

答案 0 :(得分:0)

当从accept接受重新调整新套接字时,必须使用此套接字创建一个新线程,以便在此线程中处理一对一通信。袜子不必非阻塞。