Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
2395 connectés 

  FORUM HardWare.fr
  Programmation
  C

  problème socket et envoi paquet UPD

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème socket et envoi paquet UPD

n°2286150
Profil sup​primé
Posté le 04-08-2016 à 16:31:21  answer
 

Bonjour,
 
J'envoie un paquet UDP en local avec le code suivant :
 

Code :
  1. void sendudptolocal(uchar *buf, int len)
  2. {
  3.    int sock;
  4.    struct sockaddr_in addr;
  5.  
  6.    sock = socket(AF_INET, SOCK_DGRAM, 0);
  7.    if (sock < 0)
  8.        return;
  9.  
  10.    addr.sin_family = AF_INET;
  11.    addr.sin_port = htons(scl.serverport+2);
  12.    addr.sin_addr.s_addr = INADDR_ANY;
  13.  
  14.    sendto(sock, buf, len, 0, (struct sockaddr*)&addr, sizeof(addr));
  15.  
  16.    close(sock);
  17. }


 
Quand je regarde avec wireshark, ça fonctionne bien (paquet UDP, avec une taille bien reconnue etc.) :
 

Code :
  1. 59068 362.790364663 127.0.0.1 127.0.0.1 UDP 66 35902 → 28765  Len=22


 
 
J'aimerais éviter de recréer et fermer un socket systématiquement. Du coup j'ai changé le bout de code pour :
 

Code :
  1. void sendudptolocal(uchar *buf, int len)
  2. {
  3.    static int sock = -1;
  4.    struct sockaddr_in addr;
  5.  
  6.    if (sock < 0) sock = socket(AF_INET, SOCK_DGRAM, 0);
  7.    if (sock < 0)
  8.        return;
  9.  
  10.    addr.sin_family = AF_INET;
  11.    addr.sin_port = htons(scl.serverport+2);
  12.    addr.sin_addr.s_addr = INADDR_ANY;
  13.  
  14.    sendto(sock, buf, len, 0, (struct sockaddr*)&addr, sizeof(addr));
  15. }


 
Et là rien ne va plus :
 

Code :
  1. 299452 2540.827394285 127.0.0.1 127.0.0.1 GVSP 66 Unknown Format (0x0) [Block ID: 0 Packet ID: 0] Unknown Payload Type (0x0)


 
Qu'ai-je raté ?  
 
Merci de votre aide!

Message cité 1 fois
Message édité par Profil supprimé le 04-08-2016 à 16:31:37
mood
Publicité
Posté le 04-08-2016 à 16:31:21  profilanswer
 

n°2286153
tpierron
Posté le 04-08-2016 à 16:59:19  profilanswer
 


Ça ne me parait pas bon cette ligne: INADDR_ANY vaut 0.0.0.0, ce qui ne correspond pas à l'adresse de broadcast. Tu voulais sans doute mettre inet_addr("127.0.0.1" )
 
Aussi toujours mettre les champs de la structure "sockaddr_in" à zéro, il y a toujours des champs réservés qui pourrait expliquer la différence de comportement entre les deux versions.

n°2286164
Profil sup​primé
Posté le 04-08-2016 à 18:50:48  answer
 

Salut, et merci
 
J'ai fait ça (avec un bzero), mais sans succès :/
j'avais mis INADDR_ANY pour l'instant en effet, avec 1270.0.1 ça ne change rien :/
 
J'ai l'impression que mon paquet contient les bonnes données, c'est l'entête qui merde on dirait

n°2286187
tpierron
Posté le 04-08-2016 à 23:00:40  profilanswer
 

Avant de vérifier ce qui se passe niveau couche réseau, regarde d'abord si tu recois les paquets. J'avais testé avec netcat en utilisant une commande du genre "nc -l -u -p 12345" et un programme comme :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5. #include <ctype.h>
  6. #include <winsock.h>
  7.  
  8. static int sock = -1;
  9.  
  10. void sendudptolocal(char *buf, int len)
  11. {
  12.     struct sockaddr_in addr;
  13.     if (sock < 0) sock = socket(AF_INET, SOCK_DGRAM, 0);
  14.     if (sock < 0)
  15.         return;
  16.  
  17.     memset(&addr, 0, sizeof addr);
  18.     addr.sin_family = AF_INET;
  19.     addr.sin_port = htons(12345);
  20.     addr.sin_addr.s_addr = inet_addr("127.0.0.1" );
  21.  
  22.     sendto(sock, buf, len, 0, (struct sockaddr*)&addr, sizeof(addr));
  23. }
  24.  
  25. int main(void)
  26. {
  27.     WSADATA wsaData;
  28.     WSAStartup(MAKEWORD(1,1), &wsaData);
  29.  
  30.     sendudptolocal("HELLO ", 6);
  31.     sendudptolocal("WORLD!", 6);
  32.     closesocket(sock);
  33.     return 0;
  34. }


Et netcat m'a bien affiché "HELLO WORLD!". Si ça déjà ça ne fonctionne pas, tu as un problème ailleurs que dans ce code.

n°2286204
Profil sup​primé
Posté le 05-08-2016 à 11:02:09  answer
 

Merci !
 
Je me demande si ce n'est pas tout simplement wireshark qui interpète mes paquets commeun protocole particulier alors que ça n'a pas lieu d'être. J'ai l'impression que leur contenu est correct.. Etonnant


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  problème socket et envoi paquet UPD

 

Sujets relatifs
raw socket - CProgramme qui récupere une trame et l'envoi via liaison Xbee
C : Envoi et retour d'un tableau dans des fonctions.[PHP/Bootstrap] Problème de pièce jointe et d'envoi de données
plateforme d'envoi de sms automatiqueJAVA - Distribution d'un paquet de carte
[Python] Socket et interface réseauEnvoi mail via AutoIT
Problème d'envoi de mailsCréation pdf avec envoi mail (TCPDF)
Plus de sujets relatifs à : problème socket et envoi paquet UPD


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR