Comment puis-je lier un socket à une interface réseau particulière? J'ai essayé d'utiliser setsockopt
côté serveur, mais les clients peuvent toujours accéder au service via les interfaces eth0 et lo.
Je peux y parvenir en définissant l'adresse IP particulière à l'aide de serv_addr.sin_addr.s_addr
.
Mais je soupçonne que nous pouvons nous lier à une interface en utilisant uniquement setsockopt
(sans mentionner l'adresse IP).
Vous pouvez vous lier à une interface spécifique en définissant SO_BINDTODEVICE
option de socket.
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0");
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) {
... error handling ...
}
Avertissement : Vous devez être root et avoir le CAP_NET_RAW
capacité pour utiliser cette option.
La deuxième méthode est que vous pouvez résoudre l'adresse IP liée à une interface avec getifaddrs () .
Suivez ce dernier lien pour un exemple complet.
La seule façon de le faire est que vous mentionnez -
en définissant l'adresse IP particulière à l'aide de
serv_addr.sin_addr.s_addr
Vous ne pouvez pas le faire sans connaître l'adresse de liaison.
Vous pouvez utiliser ioctl
s pour déterminer l'adresse IP actuelle si vous en avez besoin, bien qu'il puisse y avoir un moyen plus intelligent de le faire de nos jours - je n'ai pas fait beaucoup de choses dans les distributions Linux modernes ces derniers temps.