Programmation Socket C (Linux Ubuntu)

J’écris un programme qui communique sur le réseau en utilisant TCP. Si l’utilisateur fournit l’adresse IP en tant qu’argument de ligne de commande, le programme tente de se connecter à cette adresse. Sinon, il faudra attendre que d’autres se connectent. Par souci de clarté, même s’il s’agit d’une connexion p2p, j’appellerais celle qui attend que les autres utilisateurs se connectent en tant que serveur et l’autre en tant que client. Le serveur n’a aucun problème à recevoir le message texte envoyé par le client. Cependant, le côté client ne reçoit les messages texte du serveur que lorsqu’il envoie son propre message. Comment puis-je résoudre ce problème pour que les clients reçoivent des messages immédiatement? Ceci est un extrait de mon code

a.sin_family = AF_INET; a.sin_addr.s_addr = iet_addr(SERVER_IP); addr.sin_port = htons((unsigned short)SERVER_PORT); 

J’utilise ici le même socket que j’utilise pour l’envoi. Dois-je en créer un nouveau pour l’écouter?

 fgets(buffer,sizeof(buffer),stdin); send(socket,buffer,strlen(buffer),0); b = recv(socket,buffer,sizeof(buffer),0); buffer[b] = 0; printf("%s",buffer); 

Édité: Ceci est pour la prise d’écoute

 add.sin_family = AF_INET; add.sin_addr.s_addr = htonl(atoi("127.0.0.1")); add.sin_port = htons((unsigned short)NEWPORT); 

Edit: Ceci est un code obligatoire

 bind(socket,(struct sockaddr *)&add,sizeof(add)); 

Dois-je en créer un nouveau pour l’écouter?

Oui, puisque le socket sera lié à une adresse différente.

Vous pouvez recevoir des données du serveur via ce socket, mais pour accepter de nouvelles connexions, vous avez besoin d’un socket d’écoute et de 1 socket par autre client. Rappelez-vous qu’une socket est un sharepoint terminaison pour la communication .

Le problème avec votre programme est que vous utilisez des appels d’E / S bloquants, qui sont plutôt difficiles à gérer lorsque vous voulez quelque chose de différent d’un mécanisme de requête-réponse ssortingct. Par exemple, alors que fgets attend la saisie de l’utilisateur, vous ne pouvez pas consulter le réseau et vous ne recevez pas les messages qui vous sont envoyés tant que l’utilisateur fgets terminé, et uniquement lorsque l’utilisateur fgets sur Enter . Si l’utilisateur ne touche aucune touche pendant une heure, votre programme fgets pendant une heure.

Pour que cela fonctionne, vous devez découpler le code réseau du code d’entrée utilisateur (vous ne pouvez pas attendre l’un d’eux à l’infini, ce qui retarde le trafic de l’autre). Normalement, cela peut être fait soit en utilisant des threads (de sorte que l’appel d’E / S bloquant bloque un seul thread), ou en utilisant des E / S non bloquantes (de sorte qu’aucun appel d’E / S ne bloque quoi que ce soit). En utilisant C, je choisirais ce dernier.