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

  FORUM HardWare.fr
  Programmation
  C

  Linux C/C++ broadcast UDP sur machine sans gateway

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Linux C/C++ broadcast UDP sur machine sans gateway

n°2105202
Mara's dad
Yes I can !
Posté le 07-10-2011 à 10:59:22  profilanswer
 

Bonjour,
 
Comme indiqué, je cherche à envoyer un paquet UDP en broadcast.
Tout va bien si la table de routage a une default gateway.
 
En revanche quand il n'y en a pas, j'ai le message "Network is unreachable"
 
D'après ce que j'ai lu, c'est normal, mais en même temps bizarre car il me semble que le broadcast n'est pas propagé par les routeurs.
 
Mon code :
 

Code :
  1. bool CUdpSocket::broadcast( unsigned int port, uint8* buffer, unsigned int length )
  2. {
  3.   int                     flags = 0;
  4.   int                     yes = 1;
  5.   struct sockaddr_in      addr_out;
  6.   memset( &addr_out, 0, sizeof(addr_out) );
  7.   addr_out.sin_family = AF_INET;
  8.   addr_out.sin_addr.s_addr = INADDR_BROADCAST;
  9.   addr_out.sin_port = htons( static_cast<unsigned short>(port) );
  10.   int ret_code = setsockopt( _socket_id, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes) );
  11.   if( ret_code < 0 )
  12.   {
  13.     CSysLog::sysLog (CSysLog::ERR, "CUdpSocket::broadcast:setsockopt KO." );
  14.     return false;
  15.   }
  16.   if( static_cast<int>(length) != ( ret_code = sendto( _socket_id, buffer, length, flags, (struct sockaddr*)&addr_out, sizeof(addr_out) ) ) )
  17.   {
  18.     if (ret_code == -1)
  19.     {
  20.       CSysLog::sysLog (CSysLog::ERR, "CUdpSocket::broadcast:sendto" );
  21.     }
  22.     else
  23.     {
  24.       CSysLog::sysLog (CSysLog::ERR, "CUdpSocket::broadcast:sendto: %d caracteres emis au lieu de %d", ret_code, length);
  25.     }
  26.     return false;
  27.   }
  28.   return true;
  29. }


 
Est-ce que ce que j'essaye de faire est possible ?
 
Bien sûr, la solution est d'ajouter une default gateway, mais mon soft ne peut pas avoir cette garantie...


Message édité par Mara's dad le 07-10-2011 à 11:06:39

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
mood
Publicité
Posté le 07-10-2011 à 10:59:22  profilanswer
 

n°2105355
gilou
Modérateur
Modzilla
Posté le 08-10-2011 à 16:50:10  profilanswer
 

Bon, j'ai répondu en MP, mais on peut tenter d'en faire profiter tout le monde:
 
essayer avec flags = MSG_DONTROUTE; car c'est le flags = 0 qui fait qu'un envoi en INADDR_BROADCAST avec l'option SO_BROADCAST tente de voir quels sont le(s )gateway(s).

Citation :

sendto 255.255.255.255:
If the socket option SO_BROADCAST is not set, nothing happens.
If sendflag = MSG_DONTROUTE, all host in your LAN segment can receive your message.
If sendflag = 0, your gateway router(s) will make decision of broadcasting the message to other network segments.


Noter qu'en WIN32, l'implementation de Microsoft "ignores silently" ce flag MSG_DONTROUTE...
 
A+,


Message édité par gilou le 08-10-2011 à 16:56:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2105358
Mara's dad
Yes I can !
Posté le 08-10-2011 à 17:00:57  profilanswer
 

Je comprends, mais je ferais profiter les autres de mon expérience quand j'aurais une solution qui marche.
 
Comme dis en MP, j'ai déjà testé MSG_DONTROUTE, mais sans succès.
 
La suite lundi matin sauf si une priorié triple 0 me tombe dessus !
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°2105360
gilou
Modérateur
Modzilla
Posté le 08-10-2011 à 17:51:30  profilanswer
 

Mais notes aussi que le pb est peut être du à ton kernel qui est pas de première jeunesse. Il y a eu du patch en 2006 qui me semble en rapport avec cette situation: http://freebsd.1045724.n5.nabble.c [...] 80915.html
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2105371
Mara's dad
Yes I can !
Posté le 08-10-2011 à 19:19:29  profilanswer
 

Oui, c'est un 2.4.17 ou 27 je ne sais plus trop, mais il est bien probable que ce soit le cas.
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°2105499
Mara's dad
Yes I can !
Posté le 10-10-2011 à 08:43:21  profilanswer
 

Bon et bien je confirme, avec mon kernel 2.4.27 (que je ne peux pas changer) si je met le flag MSG_DONTROUTE, j'ai "Network is unreachable" que j'ai ou non une gateway !
 
Je vais donc passer au plan B pour mon prog :
 
Si pas de gateway, ajouter default gateway = mon ip.
 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.

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

  Linux C/C++ broadcast UDP sur machine sans gateway

 

Sujets relatifs
Convolution de 2 tableaux unidimensionnels avec FFTW C++Dessiner graphe via un programme C++
Core dumped en CC/C# peu importe, Lister les cartes son
Compiler des sources C++ sur WindowsProblème connection base de données en C++
Programme en C qui demande la saisie du JJ/MM/AAAA[resolut|C] Le jeu de la vie: cellules adjacentes
Plus de sujets relatifs à : Linux C/C++ broadcast UDP sur machine sans gateway


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