transfert entier sur une socket en C
Quel est le moyen le plus approprié pour transférer un int
sur une socket en C?
Ce que je fais jusqu'à présent est:
int n = 4;
int tmp = htonl(n);
write(socket, &tmp, sizeof(tmp));
et
int tmp,n;
read(socket, &tmp, sizeof(tmp));
n = ntohl(tmp);
Cependant, l'entier reçu est parfois 0. Pas toujours, mais disons 2 fois sur 5. Il n'est jamais une autre valeur, toujours 0. Pourquoi?
Mise à JOUR: la valeur de Retour de lecture est de -1 et une erreur est:
Resource temporarily unavailable
- avez-vous vérifier la valeur de retour de
read
pour voir si elle a effectivement rempli le buffer? - Le code snippit que vous fournissez sont correctes. Quel que soit le problème que vous rencontrez est dans le code, vous n'êtes pas à l'affichage.
- Dans le cas lorsque " 0 " est reçu, le retour de lecture est de -1. Lorsque les entier est reçu, le retour de lecture est de 4. C'est, je suppose, ok, mais encore - comment puis-je le résoudre? :/
- Peut-être à chercher jusqu'à ce que
-1
moyens deread
? Cela signifie que vous n'avez pas lu. - Fournir reproductible code.
- Avez-vous mis
O_NONBLOCK
sur le socket? Si oui, alors cette erreur indique que les données n'était pas encore arrivé. Essayez de nouveau plus tard. - avec
O_NONBLOCK
utiliser select, sondage, epoll ou kqueue.. - Je pense que la bonne façon serait de sondage la prise et la lecture que lorsque vous êtes sûr il y a des données sur le support disponible pour la lecture...
- Êtes-vous à l'aide d'un socket TCP qui bloque?
- je suis à l'aide d'un non-blocage de la socket TCP.
- alors soit utiliser le blocage des I/O, ou sinon attendre qu'il y est à disposition des données à lire. Vous ne pouvez pas lire des données qui n'est pas encore arrivé à votre machine.
- merci à tous, j'ai réussi à le résoudre au dernier
Vous devez vous connecter pour publier un commentaire.
Tout d'abord,
sizeof(int)
peuvent différer sur votre émetteur et le récepteur de la machine. Donc, je vous recommande d'utiliser quelque chose commeint32_t
destdint.h
.Aussi, il n'est pas garanti que
read(..,..,sizeof(int))
va lire exactementsizeof(int)
octets - il peut rien lu, ou il peut lire moins octets. Ainsi, la variante correcte sera quelque chose comme ceci:receive
fonction est totalement faux. À mon humble avis vous avez utiliséret
au lieu derc
qui est en fait jamais utiliséCela devrait fonctionner sans problème, essayez ceci :
Sur l'expéditeur (Serveur) côté :
Sur le récepteur(client) côté :
Espère que cela aidera.
htonl
etntohl
Depuis, personne n'a mentionné
sprintf
il vous suffit de convertir tout variable à
char*
l'aide et de l'envoyerTest
Utilisation
%d
pour les entiers,%f
pour des flotteursà reconvertir d'un entier, d'utilisation
atoi(char*)
pour reconvertir à un flotteur, utilisez
atof(char*)
avant la conversion, assurez-vous d'utiliser
strstr()
pour obtenir la valeur float seulement, à partir de"0"
Pour les entiers (pas positions), vous pouvez utiliser la même technique et multipliez simplement comme
les méthodes ci-dessus sont totalement sécurisées
Si vous voulez un plus solide de la conversion, vous pouvez utiliser
strncpy
oumemcpy
et couper la chaîne à partir d'un indice donné avec une certaine longueur en supposant que vous connaissez déjà le tampon entrantes, mais de mon point de vue personnel, je ne vous le recommande vraiment, plus précisément dans sans connexion sockets comme celui-ci, beaucoup de calculs et d'appels à la longueur du tampon, Pas facile à déboguer, parfois, si vous n'êtes pas tout à fait conscient de ce que vous faites.Peut nouveau jeu en réseau des développeurs de trouver cette réponse utile, car nous ne pouvons pas envoyer ou de recevoir à l'exception
char*
avec UDP sendto () recvfrom().