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

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

Marsh Posté le 07-10-2011 à 10:59:22    

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é.
Reply

Marsh Posté le 07-10-2011 à 10:59:22   

Reply

Marsh Posté le 08-10-2011 à 16:50:10    

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é!  --
Reply

Marsh Posté le 08-10-2011 à 17:00:57    

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é.
Reply

Marsh Posté le 08-10-2011 à 17:51:30    

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é!  --
Reply

Marsh Posté le 08-10-2011 à 19:19:29    

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é.
Reply

Marsh Posté le 10-10-2011 à 08:43:21    

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é.
Reply

Sujets relatifs:

Leave a Replay

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