comment lier raw socket à l'interface spécifique
Ma demande est en cours d'exécution sur CentOS 5.5.
Je suis à l'aide de socket raw pour envoyer des données:
sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sd < 0) {
//Error
}
const int opt_on = 1;
rc = setsockopt(m_SocketDescriptor, IPPROTO_IP, IP_HDRINCL, &opt_on, sizeof(opt_on));
if (rc < 0) {
close(sd);
//Error
}
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = my_ip_address;
if (sendto(m_SocketDescriptor, DataBuffer, (size_t)TotalSize, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0) {
close(sd);
//Error
}
Comment puis-je lier cette prise d'interface réseau spécifique (dire eth1)?
- Pourquoi voudriez-vous faire cela? Votre programme va perdre la portabilité, sauf si vous êtes sûr que votre machines ont des interfaces nommé les noms prédéfinis.
- C'est pour périphérique intégré, la portabilité n'est pas nécessaire. J'ai 6 ports Ethernet et j'ai besoin d'envoyer des données à l'aide de l'interface spécifique
Vous devez vous connecter pour publier un commentaire.
Première ligne: configurer votre variable
Deuxième ligne: dites-le programme de l'interface à se lier à
Lignes 3 à 5: obtenir la longueur du nom de l'interface et de vérifier si elle est de taille pas trop grand.
Six ligne: définissez les options de socket socket
sd
, la liaison à l'appareilopt
.setsockopt prototype:
Aussi, assurez-vous d'inclure les
if.h
,socket.h
etstring.h
fichiers d'en-têtebind()
, pas lasetsockopt()
approche présentée ici.Comme mentionné précédemment, la bonne chose à faire est d'utiliser la
struct ifreq
pour spécifier le nom de l'interface. Voici mon exemple de code.Je tiens aussi à ajouter que, d'un point de vue sécurité, tandis qu'il est bon de se lier à la prise à une interface, il ne fait pas de sens d'utiliser
INADDR_ANY
que l'écoute de l'adresse IP. Dans ce cas, le port ouvert dans netstat sur toutes les interfaces réseau.Au lieu de cela, j'ai spécifié une adresse IP spécifique à l'interface (un VLAN privé). Cette correction de la sortie de netstat trop:
struct ifreq
? Ma page de man dit: "le passé option est d'une longueur variable null nom de l'interface chaîne"Bind socket spécifique adresse IP de l'interface
Bind socket à l'interface spécifique nom
Dans
bind_using_iface_ip
, de se lier à n'importe quel port0
doit être passée. Et aussi, si lefd
est raw socket alors besoin de passer port0
. Cette liaison mécanisme est commun pour tous les types de sockets comme raw, dgram et de flux.