envoi de plusieurs send / recv in socket

J’ai besoin de quelques éclaircissements sur l’utilisation de plusieurs programmes d’envoi / réception dans les programmes de socket. Mon programme client est présenté ci-dessous (Utilisation de TCP SOCK_STREAM).

send(sockfd,"Messgfromlient",15,0); send(sockfd,"cli1",5,0); send(sockfd,"cli2",5,0); send(sockfd,"cli3",5,0); send(sockfd,"cli4",5,0); send(sockfd,"cli5",5,0); 

et le programme du serveur ressemble à celui ci-dessous.

  recv(newsockfd,buf,20,0); printf("Buffer is %s\n",buf); 

quand j’exécute le programme ci-dessus, la sortie est comme ci-dessous:

Message client: Messgfromlient

Je crois que la taille du buf est de 20, donc un seul tampon est reçu. Ajout d’un autre recv côté serveur.

  char buf[20],buf[20]; ------skipped------ recv(newsockfd,buf,20,0); recv(newsockfd,buf1,20,0); printf("Client Msg :%s\n",buf); printf("Client Msg :%s \n",buf1); 

sortie: 1er essai:

  Client Msg :Messgfromlient Client Msg :cli2 

2ème sentier:

  Client Msg :Messgfromlient Client Msg :cli1 

Comme nous pouvons voir qu’il y a une certaine contradiction dans les résultats, Du côté client, tous les messages sont envoyés, mais dans le serveur, les messages seront reçus en fonction de la taille du fichier buf, ici même si le fichier buf1 a une taille de 20, pourquoi ‘cli3’ Les messages ‘cli4”cli4’ ne sont pas reçus sur buf1 ?. Y a-t-il une limite spécifique? S’il vous plaît clarifier à ce sujet.

Merci d’avance, Raja

TCP est un protocole basé sur un stream d’octets, il ne sait rien des messages. Vous envoyez un total de 25 octets, et chacun des recv de l’autre côté lit certains de ces octets. Vous pouvez obtenir 20, vous pouvez obtenir 1 , puis 19 dans la lecture suivante, vous pouvez obtenir 5 puis 4 puis 11 puis 5. Le paramètre size à recv est le nombre maximum à lire.

Vous devez boucler la boucle jusqu’à ce que vous lisiez tout le message vous-même et comprenez également que vous pourriez recevoir plus d’un «envoi» dans le même message reçu.

le programme du serveur ressemble à celui ci-dessous.

 recv(newsockfd,buf,20,0); printf("Buffer is %s\n",buf); 

C’est déjà faux. CA devrait etre:

 int count = recv(newsockfd,buf,20,0); if (count == -1) { perror("recv"); // please improve this message close(newsocketfd); } else if (count == 0) { // peer has closed the connection close(newsockfd); } else { printf("Buffer is %.*s\n",count,buf); } 

Cela devrait vous donner assez d’indices …

Vous avez 2 problèmes:

Lorsque vous affichez les résultats, vous vous arrêtez au premier octet nul, toujours après “Messgfromlient”. Il peut y avoir plus de texte déjà reçu, mais vous ne l’affichez pas.

Le deuxième problème est que la connexion TCP est un stream. Vous pouvez recevoir toutes les données en une fois, vous ne pouvez recevoir que le premier octet. Vous ne savez pas lequel est ce et ne peut pas le prédire. Vous devez gérer les lectures incomplètes dans votre application et les tentatives.

Vous pouvez toutefois augmenter les chances que toutes les données soient envoyées dans un seul paquet plutôt que dans 6. Consultez l’option TCP_CORK.