Envoyer et recevoir un nombre entier de valeur sur TCP en C
Dans un programme, j'ai besoin d'envoyer une valeur entière sur le socket TCP. J'ai utilisé le send()
et recv()
fonctions pour la fin, mais ils sont l'envoi et la réception uniquement comme une chaîne de caractères.
Est-il une alternative pour le send()
et recv()
afin d'envoyer et de recevoir des valeurs entières?
send()
et recv()
traiter les octets. Comment interprétez-vous ces octets est à vous.Quelle langue? Partagez votre extrait de code ici pour plus d'obtenir des réponses précises.
habituellement demander un extrait de code est une bonne idée, mais note le c le tag sur la question. La plupart des questions sont marqués de cette manière.
Hmm. En fait, je peux suggérer d'envoyer le numéro de la chaîne, et donc prévenir les complications entre l'endianness, si les frais généraux n'est pas de trop.
OriginalL'auteur James Joy | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
send()
etrecv()
ne pas envoyer des chaînes. Ils envoient octets. C'est à vous de fournir une interprétation des octets qui fait sens.Si vous souhaitez envoyer des entiers, vous devez décider de ce que la taille des entiers vous allez envoyer -- 1 octet 2 octets 4 octets 8 octets, etc. Vous avez également besoin de décider sur un format d'encodage. "Réseau commande" décrit la convention de Big-Endian mise en forme. Vous pouvez convertir vers et à partir du réseau de l'ordre en utilisant les fonctions suivantes à partir de
<arpa/inet.h>
ou<netinet/in.h>
:Si vous vous en tenez à l'aide de
htonl()
avant de l'envoyer (hôte-réseau, long) etntohl()
après la réception (réseau à l'hôte, long), vous ferez bien.OriginalL'auteur sarnold
Vous pouvez envoyer l'entier de quatre octets, bien sûr (ou le nombre d'octets à votre entier qui se passe de l'être); mais vous devez être prudent. Voir la fonction
htonl()
, présenté sur votre système probablement dans<arpa/inet.h>
.En supposant un à quatre octets entier n, ce qui pourrait faire ce que vous voulez:
Alors vous pouvez le compléter, sur la fin de réception.
La raison de l'appel à
htonl()
est que la plus haute octet de poids fort est traditionnellement transmis en premier sur Internet, alors que certaines architectures informatiques comme l'omniprésent x86 magasin le plus faible octet de poids fort en premier. Si vous n'avez pas de fixer l'ordre des octets, et la machine sur l'une des extrémités est un x86, et la machine sur l'autre extrémité, c'est autre chose, puis, sans lahtonl()
l'entier viendra à travers déformé.Je ne suis pas un expert sur le sujet, d'ailleurs, mais en l'absence de experter réponses, cette réponse pourrait servir. Bonne chance.
OriginalL'auteur thb
Je l'ai essayé, trop. Mais écrire n'a pas fonctionné.
J'ai donc trouvé une autre solution.
Comment avez-vous l'impression entier en recevoir? elle doit être la même que 73232
OriginalL'auteur user2533365