2017-10-11 7 views
0

J'ai un serveur tcp et 2 clients qui veulent se connecter. La façon dont ces clients vont se connecter est que 1 d'entre eux, appelons-le client1 sera toujours connecté en envoyant des données et l'autre, client2, se connectera éventuellement, enverra une petite quantité de données et se déconnectera. J'ai mis l'option O_NONBLOCK sur. Le comportement que je ressens est que le client qui envoie continuellement des données, côté serveur, reçoit un message et attend la prochaine connexion ... Voici ce que j'ai essayé jusqu'à présent (Le code est le moment où à tout moment le client2 veut de se connecter et d'envoyer des données et déconnecter):tcp nonblocking ne fonctionne pas

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); 

J'ai aussi essayé d'ajouter l'option à l'intérieur du temps et la mise en bloquante sur newsockfd et newsockfd2 mais même résultat.

Qu'est-ce que je fais mal? Merci ! : D

+0

Et que se passe-t-il avec le code que vous affichez? Avez-vous essayé de passer le code avec un débogueur? Aucune des fonctions système ne renvoie une erreur? Et pourquoi faites-vous la même chose deux fois? –

+0

ouvrir deux prises au lieu de sauter entre les deux. Et avec une communication non bloquante, vous êtes censé utiliser epoll (ou sélectionner, ou quelque chose de ce genre). Sinon, personne n'attend rien, c'est tout le but de non-blocage. – Slava

+0

@Slava, donc vous me dites que 1 socket ne peut pas gérer 2 connexions en même temps? – Lomazo

Répondre

0

Lorsqu'un nouveau socket est renvoyé à partir d'accepter, vous devez créer un nouveau thread avec ce socket afin que la communication un-à-un sera traitée dans ce thread. Les chaussettes ne doivent pas être bloquantes.