Pour ce qui suit, je suppose une carte réseau. p>
J'ai un composant de mon programme conçu pour laisser les autres dans le sous-réseau savoir de son existence. Pour cela, j'ai mis en place une solution où chaque fois que le programme démarre (et après la suite), il envoie une diffusion à Le problème avec c'est que je ne veux pas me souvenir de mes propres émissions. Je pensais que, en théorie, cela serait facile à faire - découvrez simplement l'adresse IP locale et comparez à ce que vous obtenez dans Cependant, j'ai trouvé difficile d'obtenir l'IP locale: Remarque: J'ai lu d'autres questions sur des émissions, en particulier celle-ci: udp- Diffusée sur toutes les interfaces mais je n'ai pas encore été tournée dans la multiples interface. P> inaddr_broadcast code> - Quiconque écoute sur le port requis se souviendra d'où elle est arrivée à une utilisation ultérieure. p>
Recvrom code>. p>
gettaddrinfo code> avec NULL renvoie
127.0.0.1 code>,
gettaddrinfo code> avec le nom d'hôte Renvoie l'IP publique. Quelqu'un peut-il me signaler dans la direction de trouver l'adresse IP de sous-réseau? Je pense que je dois manquer quelque chose de très évident ici mais bien ... je me manque toujours :) p>
5 Réponses :
Eh bien au démarrage, vous pouvez diffuser un message différent avec une valeur aléatoire (mais suivie), puis attendez ce message, pour découvrir votre propre adresse, à partir de ce moment, vous pouvez envoyer des messages normaux, ignorer vos messages source. < / p>
C'est une bonne idée, mais c'est un peu pirakish - les informations sont facilement disponibles (ipconfig / ifconfig) afin que je puisse être en mesure de l'extraire d'une manière ou d'une autre
TRUE, vous pouvez le changer pour être un paramètre de votre application, puis faire un problème de script. Je suis d'accord c'est très piraqué
L'accepter cela parce que, bien que Hacky, est le seul moyen de le faire sans appels d'API spécifiques. De plus, je transmettais déjà une valeur suivie, alors j'ai juste besoin d'ajouter une ligne de code supplémentaire.
Rechercher des options SCOKET et voir si ces travaux: IP_MULTICAST_LOOP, IP_BLOCK_SOURCE P>
Ce sont des options de multidiffusion. Rien à voir avec la diffusion.
getockname code> ( Documentation de la fonction ) Peut découvrir l'adresse IP locale associée à une prise particulière. Si vous appelez ceci sur la prise que vous utilisez pour envoyer la diffusion, vous devez voir la même adresse IP que vous verrez renvoyée par
RECVFROM code>. P>
Retourne 0.0.0.0 code> sous Windows, un étrange gibberish sur Linux.
On Linux, vous pouvez obtenir l'adresse IP d'une interface donnée à l'aide d'IOCTL avec l'option siocgifaddr code>. Je ne pense pas que cela fonctionne pour Windows, cependant. Pour cela, vous devrez faire quelque chose de goofy comme Ceci . p>
(je suppose que vous travaillez sur Windows)
geipaddrable fait exactement ça! Il renvoie des données sur toutes vos interfaces réseau, l'adresse IP est parmi elles. Il y a un peu de spectacle pour les obtenir, mais pas plus que dans le reste des winsocks. p>
Voici un exemple de ligne prête à compiler 54 lignes qui imprime toutes vos interfaces réseau avec des masques IP et réseau, ainsi que des filtres de votre rappel local (127.0.0.1), car vous ne le souhaitez probablement pas, Et c'est toujours là, donc vous ne pouvez pas simplement l'ignorer: p>
(travaillé avec MSVC 19, Windows 10, lien contre iphlpapi.lib et ws2_32.lib) P>
interface: index: 7 address: 192.168.56.1 mask: 255.255.255.0 interface: index: 1 address: 127.0.0.1 mask: 255.0.0.0 local callback! interface: index: 11 address: 192.168.178.181 mask: 255.255.255.0
Pourquoi ne tirez-vous pas en train de tirer parti des solutions existantes telles que les MDNS (MultiCast-DNS)?
MDNS est trop compliqué pour mes besoins.