0
我有一个tcp服务器和2个客户端想连接到它。这种客户端将连接的方式是,其中1个,让我们打电话client1
将连接发送数据和其他,client2
,将最终连接,发送少量的数据和断开连接。我设置了O_NONBLOCK
选项。我所经历的行为是,在服务器端持续发送数据的客户端收到一条消息并等待下一个连接...这是我到目前为止所尝试的(代码是在任何时刻client2
想要的时刻连接和发送数据,并断开):tcp非阻塞不起作用
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
和newsockfd2
,但同样的结果设置非阻塞。
我在做什么错?谢谢 ! :D
你显示的代码会发生什么?您是否尝试过使用调试器单步执行代码?没有一个系统函数返回错误?你为什么要做同样的事情两次? –
打开两个插座,而不是在两者之间跳跃。与非阻塞通信,你应该使用epoll(或选择,或任何类型的东西)。否则,没有人会等任何东西,那就是非阻塞的全部目的。 – Slava
@Slava,所以你告诉我1个套接字不能同时处理2个连接? – Lomazo