2017-10-11 56 views
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); 

我也试图加入,而里面的选项,并在newsockfdnewsockfd2,但同样的结果设置非阻塞。

我在做什么错?谢谢 ! :D

+0

你显示的代码会发生什么?您是否尝试过使用调试器单步执行代码?没有一个系统函数返回错误?你为什么要做同样的事情两次? –

+0

打开两个插座,而不是在两者之间跳跃。与非阻塞通信,你应该使用epoll(或选择,或任何类型的东西)。否则,没有人会等任何东西,那就是非阻塞的全部目的。 – Slava

+0

@Slava,所以你告诉我1个套接字不能同时处理2个连接? – Lomazo

回答

0

当一个新的套接字从accept接受时,你必须用这个套接字创建一个新的线程,以便在这个线程中处理一对一的通信。袜子不必非阻挡。