2017-09-29 3 views
1

Ceci est une question macOS. J'essaie de configurer un socket UDP qui reçoit des messages SSDP, c'est-à-dire des paquets UDP, envoyés à des adresses de multidiffusion. Je souhaite limiter la réception de ces paquets à partir d'une seule interface réseau.Réception de paquets UDP multicast à partir d'une seule interface réseau sur macOS

J'ai essayé

int fd = socket(AF_INET, SOCK_DGRAM, 0); 
char* itf = "en0"; 
int res = setsockopt(fd, SOL_SOCKET, IP_RECVIF, itf, strlen(itf)); 

L'appel setsockopt échoue avec errno 42 (protocole non disponible). J'ai également trouvé SO_BINDTODEVICE qui peut être utilisé dans le même but, mais il semble que ce n'est pas disponible sur macOS. L'utilisation de bind avec le port et l'adresse ne fonctionne pas non plus. Ensuite, aucun paquet envoyé à l'adresse de multidiffusion n'est reçu sur cette socket.

Répondre

0

De l'OSX documentation on IP multicast ...

Un hôte doit devenir membre d'un groupe de multidiffusion avant de pouvoir recevoir des datagrammes envoyés au groupe. Pour rejoindre un groupe de multidiffusion, utilisez l'option IP_ADD_MEMBERSHIP ...

Pour recevoir du trafic multidiffusion sur une interface spécifique, vous devez indiquer au système d'exploitation que vous souhaitez rejoindre ce groupe de multidiffusion. Suivez ces étapes (vous y étiez presque) ...

  1. Créez un socket de datagramme (terminé).
  2. Lier à INADDR_ANY avec le port attendu.
  3. Rejoindre le groupe de multidiffusion via setsockopt() avec l'option IP_ADD_MEMBERSHIP. Vous pouvez transmettre ici l'adresse IP de l'interface réseau spécifique sur laquelle vous souhaitez recevoir le trafic multicast dans la structure ip_mreq.
+0

Merci beaucoup, cela a résolu le problème. J'utilise actuellement GCDAsyncUdpSocket de Swift. La méthode 'joinMulticastGroup()' accepte l'interface en tant que deuxième paramètre. L'implémentation utilise 'setsockopt()' avec 'IP_ADD_MEMBERSHIP'. Je ne sais pas pourquoi quelqu'un a voté votre réponse. – Bokeh