Envoyer et recevoir une valeur entière sur TCP en C

Dans un programme, je dois envoyer une valeur entière sur le socket TCP. J’ai utilisé les fonctions send() et recv() à cette fin, mais ils l’envoient et le reçoivent uniquement sous forme de chaîne.

Existe-t-il une alternative pour send() et recv() afin d’envoyer et recevoir des valeurs entières?

send() et recv() n’envoient pas de chaînes. Ils envoient des octets . C’est à vous de donner une interprétation des octets qui a du sens.

Si vous souhaitez envoyer des entiers, vous devez décider de la taille des entiers que vous allez envoyer: 1 octet, 2 octets, 4 octets, 8 octets, etc. Vous devez également choisir un format de codage . “Ordre du réseau” décrit la convention du formatage Big-Endian. Vous pouvez convertir vers et depuis l’ordre réseau en utilisant les fonctions suivantes de ou :

  uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); 

Si vous vous en tenez à utiliser htonl() avant d’envoyer (hôte à réseau, long) et à ntohl() après réception (réseau à hôte, long), tout se passera bien.

Vous pouvez envoyer le nombre entier sous forme de quatre octets, bien sûr (ou le nombre d’octets que votre nombre entier se trouve être); mais il faut faire attention. Voir la fonction htonl() , présentée sur votre système probablement dans .

En supposant un entier n sur quatre octets, ceci pourrait faire ce que vous voulez:

 uint32_t un = htonl(n); send(sockfd, &un, sizeof(uint32_t), flags); 

Ensuite, vous pouvez coder le complément sur le destinataire.

L’appel à htonl() s’explique par le fait que l’octet de htonl() fort est généralement transmis en premier sur Internet, alors que certaines architectures informatiques comme l’omniprésent x86 stockent d’abord l’octet de htonl() faible. Si vous ne corrigez pas l’ordre des octets et que la machine à une extrémité est un x86 et que la machine à l’autre extrémité en est une autre, alors sans l’ htonl() l’entier sera tronqué.

Je ne suis d’ailleurs pas un expert sur le sujet, mais en l’absence de réponses d’expert, cette réponse pourrait être utile. Bonne chance.

J’ai essayé aussi. Mais écrire n’a pas fonctionné. J’ai donc trouvé une autre solution.

 // send char integer[4]; // buffer *((int*)integer) = 73232; // 73232 is data which I want to send. send( cs, integer, 4, 0 ); // send it // receive char integer[4]; // buffer recv( s, integer, 4, 0 ); // receive it