problème socket et envoi paquet UPD

problème socket et envoi paquet UPD - C - Programmation

Marsh Posté le 04-08-2016 à 16:31:21    

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
Reply

Marsh Posté le 04-08-2016 à 16:31:21   

Reply

Marsh Posté le 04-08-2016 à 16:59:19    


Ç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.

Reply

Marsh Posté le 04-08-2016 à 18:50:48    

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

Reply

Marsh Posté le 04-08-2016 à 23:00:40    

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.

Reply

Marsh Posté le 05-08-2016 à 11:02:09    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed