我有一个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
答案 0 :(得分:0)
当从accept接受重新调整新套接字时,必须使用此套接字创建一个新线程,以便在此线程中处理一对一通信。袜子不必非阻塞。