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
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? –
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
@Slava, donc vous me dites que 1 socket ne peut pas gérer 2 connexions en même temps? – Lomazo