2010-10-17 4 views
1

Je travaille sur la diffusion, et je n'arrive pas vraiment à faire fonctionner la machine. Je sais que je dois faire l'appel setsockopt(), mais ce qui est nécessaire avant cela pour s'assurer que la diffusion ira à chaque boîte sur le réseau? Je me souviens vaguement de quelque chose à propos de compléter l'adresse réseau ou quelque chose comme ça. J'apprécie l'aide.Qu'est-ce qui est requis pour faire une diffusion UDP en C?

+2

Postez votre code source complet. Lisez les pages de manuel. –

+1

Les avocats de Microsoft ont appelé. Ils ont dit quelque chose à propos d'evantravers enfreignant leur brevet sur le fait d'amener les réseaux locaux à une exploration. –

+0

Vous devrez diriger votre diffusion à l'adresse de diffusion du sous-réseau que vous souhaitez diffuser. Pour plus d'informations: http://beej.us/guide/bgnet/output/html/multipage/advanced.html#broadcast – ivymike

Répondre

1

Vous n'avez pas besoin d'utiliser setsockopt(). Un paquet UDP envoyé à l'adresse spéciale 255.255.255.255 sera envoyé à toutes les adresses sur le réseau local. Si le réseau que vous souhaitez diffuser n'est pas local, vous devez utiliser l'adresse de diffusion de ce réseau (conformément au commentaire de Ivymike), qui est normalement (mais pas toujours) la dernière adresse IP du sous-réseau. Gardez à l'esprit que les adresses de diffusion sont utilisées dans un certain nombre d'attaques DOS et sont susceptibles d'être filtrées.

+0

C'était la réponse, merci beaucoup! – evantravers

0

Je ne suis pas sûr que la réponse acceptée soit correcte quand il s'agit du monde de Windows. J'ai une classe UDPSocket qui est inspirée par this answer. Il a été utilisé pendant un certain temps et fonctionne bien. Mais j'ai juste essayé de l'utiliser pour faire une fonction WakeOnLan() qui diffuse à 255.255.255.255, et l'appel sendto() a échoué avec Windows Erreur Socket 10013 - Permission refusée (au moins comme testé sur mon système Windows 7).

Je tendis constructeur UDPSocket avec un setsockopt() appel basé sur la réponse de Remy Lebeau à this question, placé immédiatement après l'appel socket(). Cela a permis la diffusion, et était le chaînon manquant dans la production de ma fonction WakeOnLan(). Je ne suggère pas que c'est "la réponse", mais c'est trop long pour un commentaire, et le wiki de la communauté pourrait vouloir éditer une vérité plus générale dans cette réponse pour le bénéfice de ceux qui trouvent la réponse acceptée tombe court.

Questions connexes