[C/C++]Socket UDP ouvrir fermer une socket vite

Socket UDP ouvrir fermer une socket vite [C/C++] - C++ - Programmation

Marsh Posté le 19-04-2003 à 08:13:05    

salut a tous !
Voila j'essaye d envoye un message a mes 2 PC en rezo enfain faire un prog tt con ki se connecter en UDP é ki envoye un message aux 2 PC mais seulement 1 PC recoit le message .
 
voici le source :

Code :
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #include <windows.h>
  4. #pragma comment(lib, "ws2_32.lib" )
  5. void main(void)
  6. {
  7. SOCKET c;
  8. SOCKADDR_IN to;
  9. WSADATA wsa;
  10. WORD v;
  11. int i;
  12. char buf[] = "test test";
  13. //Windows socket init//
  14. v = MAKEWORD(2, 0);
  15. if(WSAStartup(v, &wsa) != 0)
  16.  exit(EXIT_FAILURE);
  17. ///////////////////////
  18. //Socket//
  19. c = socket(AF_INET, SOCK_DGRAM, 0);
  20. to.sin_family = AF_INET;
  21. to.sin_addr.s_addr = inet_addr("192.168.0.1" );
  22. to.sin_port = htons(1989);
  23. sendto(c, buf, sizeof(buf), 0, (LPSOCKADDR)&to, sizeof(to));
  24. closesocket(c);
  25. WSACleanup();
  26. c = socket(AF_INET, SOCK_DGRAM, 0);
  27. to.sin_family = AF_INET;
  28. to.sin_addr.s_addr = inet_addr("192.168.0.2" );
  29. to.sin_port = htons(1989);
  30. sendto(c, buf, sizeof(buf), 0, (LPSOCKADDR)&to, sizeof(to));
  31. closesocket(c);
  32. WSACleanup();
  33. return;
  34. }


 
je pense ke cela et du a la rapidité ke la socket n as pas le temps de se fermer pour apres se réouvrir !
 
merci a +++

Reply

Marsh Posté le 19-04-2003 à 08:13:05   

Reply

Marsh Posté le 19-04-2003 à 09:15:54    

Le premier WSACleanup(); ne serait pas en trop?? ou alors, il faudrait pas que tu refasses un appel a WSAStartup(...) apres??
Ca me semble sauter aux yeux, en lisant ton code.
 
A+,


Message édité par gilou le 19-04-2003 à 09:26:59

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-04-2003 à 09:30:38    

ca change kedal :(

Reply

Marsh Posté le 19-04-2003 à 09:55:59    

Si ceci fonctionne:
 

Code :
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #include <windows.h>
  4. #pragma comment(lib, "ws2_32.lib" )
  5. void main(void)
  6. {
  7. SOCKET c,c1;
  8. SOCKADDR_IN to, to1;
  9. WSADATA wsa;
  10. WORD v;
  11. int i;
  12. char buf[] = "test test";
  13. //Windows socket init//  
  14. v = MAKEWORD(2, 0);
  15. if(WSAStartup(v, &wsa) != 0)
  16. exit(EXIT_FAILURE);
  17. ///////////////////////  
  18. //Socket//  
  19. c = socket(AF_INET, SOCK_DGRAM, 0);
  20. c1 = socket(AF_INET, SOCK_DGRAM, 0);
  21. to.sin_family = AF_INET;
  22. to1.sin_family = AF_INET;
  23. to.sin_addr.s_addr = inet_addr("192.168.0.1" );
  24. to1.sin_addr.s_addr = inet_addr("192.168.0.2" );
  25. to.sin_port = htons(1989);
  26. to1.sin_port = htons(1989);
  27. sendto(c, buf, sizeof(buf), 0, (LPSOCKADDR)&to, sizeof(to));
  28. sendto(c1, buf, sizeof(buf), 0, (LPSOCKADDR)&to1, sizeof(to1));
  29. closesocket(c);
  30. closesocket(c1);
  31. WSACleanup();
  32. return;
  33. }

 
Alors, ca peut en effet etre du a un réemploi de la socket ou de la structure SOCK_ADDR, avant qu'elle ait fini d'envoyer ce qu'elle a a envoyer (auquel cas, ce devrait etre ta 2e machine seulement qui devrait recevoir correctement le message). Essayes alors de tenir compte d'un parametre SO_LINGER dans les options de la socket.
 
De toute façon, les codes d'erreurs de sendto dans ton source initial devraient permettre de savoir ou est le pb, une fois décriptés avec WSAGetLastError.  
 
A+,


Message édité par gilou le 19-04-2003 à 10:33:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-04-2003 à 10:03:04    

CtHuLhU50 a écrit :

salut a tous !
Voila j'essaye d envoye un message a mes 2 PC en rezo enfain faire un prog tt con ki se connecter en UDP é ki envoye un message aux 2 PC mais seulement 1 PC recoit le message .

Y a une contradiction, là [:figti] :D  
 
Sinon, je me demande si tu peux pas utiliser la même socket pour les 2 envois. Puisqu'il n'y a pas de notion de connexion en UDP.
 
Mais de toute façon, avec UDP, rien ne garantit que ce que tu envoies arrive correctement [:proy]


Message édité par mrbebert le 19-04-2003 à 10:03:19
Reply

Marsh Posté le 19-04-2003 à 12:31:13    

essayes de mettre tout le code d'envoi (de //Windows socket init jusqu'au 1er WSACleanup) dans un thread, que tu appeleras 2 fois avec comme parametre l'IP de chaque machine dans le main, avec un wait pour attendre la fin des 2 threads.
 
ca complique bien le tout, donc c'est mieux.
tu peux aussi faire une fonction a la place d'un thread, mais c'est moins marrant.

Reply

Marsh Posté le 19-04-2003 à 12:36:35    

C bon j'ai trouvé mon erreur merci les gars :)

Reply

Marsh Posté le 19-04-2003 à 15:23:37    

CtHuLhU50 a écrit :

C bon j'ai trouvé mon erreur merci les gars :)


Et si tu nous disais ce que c'etait? ca ne mange pas de pain.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-04-2003 à 16:03:02    

ben enfaite g pas totalement trouvé car les udp marche k avec l'ip 127.0.0.1 l ' ip local ....
 
par example kand je fé ca :
c = socket(AF_INET, SOCK_DGRAM, 0);
     to.sin_family = AF_INET;
     to.sin_addr.s_addr = inet_addr("192.168.0.2" );
     to.sin_port = htons(1989);
 
avec 192.168.0.2 c'est l'ip de ma carte rezo sur mon PC ca ne marche pas ....


Message édité par CtHuLhU50 le 19-04-2003 à 16:05:04
Reply

Marsh Posté le 19-04-2003 à 16:12:58    

voila g trouvé ca venait de mon server erfff

Reply

Sujets relatifs:

Leave a Replay

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