[C++] Socket UDP - Pb Reception du datagramme

Socket UDP - Pb Reception du datagramme [C++] - C++ - Programmation

Marsh Posté le 03-06-2003 à 11:16:09    

hello !
 
Voilà j'ai un p'tit soucis avec mon prog. Je dois receptionner des datagrammes UDP sur le port 162 (c'est des Traps SNMP) et j'utilise pour ça le p'tit Packet Recever ci dessous. Mais le pb, c'est que je ne reçoit que quelques octets et pas le datagramme complet. Comme on fait pour capturer la totalité de la trame qui arrive ??? :??:  
 
Help me ?
 
Si vous connaissez d'autres moyens pour receptionner les traps SNMP en Visual C++, je suis preneur car je crois que je vais galerer avec cette solution :cry: . J'ai vu qu'il existait un truc qui s'appelle MSDN WinSNMP mais j'ai pas le moindre de bout de code ou tuto pour etudier çà  :(  
 

Code :
  1. #include<stdio.h>
  2. #include<winsock2.h>
  3. #pragma comment(lib,"ws2_32.lib" )
  4. void main()
  5. {
  6. WSADATA wsa;
  7. WSAStartup(MAKEWORD(2,0),&wsa);
  8. SOCKET sock;
  9. SOCKADDR_IN sin;
  10. printf("UDP Packet Recever\n\n" );
  11. int port,i;
  12. printf("Port : " );
  13. scanf("%i",&port);
  14. sin.sin_family=AF_INET;
  15. sin.sin_addr.s_addr=INADDR_ANY;
  16. sin.sin_port=htons(port);
  17. sock=socket(AF_INET,SOCK_DGRAM,0);
  18. bind(sock,(SOCKADDR*)&sin,sizeof(sin));
  19. unsigned char buffer[1500];
  20. int sinsize=sizeof(sin);
  21. int size;
  22. while(1)
  23. {
  24.  memset(buffer,0,sizeof(buffer));
  25.     size=recvfrom(sock,(char *) buffer,sizeof(buffer),0,(SOCKADDR*)&sin,&sinsize);
  26.  printf("Size : %i\n",size);
  27.  for (i=0;i<size;i++)
  28.   {
  29.    printf("%x ",buffer[i]);
  30.   }
  31.  printf("\n" );
  32. }
  33. }


Message édité par k-id le 03-06-2003 à 14:46:41
Reply

Marsh Posté le 03-06-2003 à 11:16:09   

Reply

Marsh Posté le 03-06-2003 à 11:18:16    

Laisse moi deviner ça t'affiche que les 4 derniers octets non?
 
(edit je voulais dire premiers, mais bon c même pas ça en plus :D)


Message édité par LetoII le 03-06-2003 à 11:25:48

---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 11:20:15    

LetoII a écrit :

Laisse moi deviner ça t'affiche que les 4 derniers octets non?


 
Voui j'ai que 4 octets dans mon buffer ! ça vient de quoi  :??:

Reply

Marsh Posté le 03-06-2003 à 11:24:29    

Si mes souvenirs sur printf sont bons, ton printf("%X",buffer) interpréte l'adresse de ton buffer comme un entier et te l'affiche en exa. Si tu veux afficher to buffer je te conseil de récupérer la taille renvoyée par recvfrom et d'afficher ton buffer par groupe de 4 octets ou un truc du genre


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 11:27:40    

LetoII a écrit :

Si mes souvenirs sur printf sont bons, ton printf("%X",buffer) interpréte l'adresse de ton buffer comme un entier et te l'affiche en exa. Si tu veux afficher to buffer je te conseil de récupérer la taille renvoyée par recvfrom et d'afficher ton buffer par groupe de 4 octets ou un truc du genre


 
oki j'essaye ça  :)  
 
Merci

Reply

Marsh Posté le 03-06-2003 à 14:11:43    

bon ya du mieux, j'arrive à afficher la totalité de mes données reçues en fesant une p'tit boucle qui va bien  
 
Mais par contre j'ai quelques couilles dedans genre au lien d'avoir la valeur hexa par ex 'A0' et ben j'ai 'FFFFFFA0' mais ça le fait pas tout le temps  :pt1cable:  
 
J'arrive pas à résoudre ce pb... une idée  :??:  
@+

Reply

Marsh Posté le 03-06-2003 à 14:24:01    

fait voir ton code d'affichage


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 14:29:43    

LetoII a écrit :

fait voir ton code d'affichage


 
J'ai modifié le code du premier post.

Reply

Marsh Posté le 03-06-2003 à 14:30:38    

k-id a écrit :


 
J'ai modifié le code du premier post.


 
Oups  :whistle:


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 14:33:00    

Alors déjà tu passe buffer en unsigned char et au lieu de faire un printf de buffer[i] tante un unsigned int temp = buffer[i]; et tu affiche temp.


---------------
Le Tyran
Reply

Marsh Posté le 03-06-2003 à 14:33:00   

Reply

Marsh Posté le 03-06-2003 à 14:42:15    

LetoII a écrit :

Alors déjà tu passe buffer en unsigned char et au lieu de faire un printf de buffer[i] tante un unsigned int temp = buffer[i]; et tu affiche temp.


 
Veux pas passer en unsigned char cr recvfrom demande un char  :cry:  
 
error C2664: 'recvfrom' : cannot convert parameter 2 from 'unsigned char [1500]' to 'char *'  :??:

Reply

Marsh Posté le 03-06-2003 à 14:45:21    

k-id a écrit :


 
Veux pas passer en unsigned char cr recvfrom demande un char  :cry:  
 
error C2664: 'recvfrom' : cannot convert parameter 2 from 'unsigned char [1500]' to 'char *'  :??:  


 
ah c bon en fait il fallait mettre :
size=recvfrom(sock,(char *) buffer,sizeof(buffer),0,(SOCKADDR*)&sin,&sinsize);
 
ça marche !! merci bcp
 
 

Reply

Sujets relatifs:

Leave a Replay

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