Créer une socket avec une interface Ethernet (eth0, eth1) (Linux, C, Raspberry Pi)

Contexte

En langage Raspberry Pi + C, j'ai parfois envie de communiquer avec deux interfaces Ethernet, et c'est un mémo de ce que j'ai appris à ce moment-là. Décrit comment créer une prise Ethernet et comment spécifier une prise Ethernet. Nous avons confirmé l'opération dans l'environnement suivant. [Matériel] Raspberry Pi2 modèle B [OS]Raspbian GNU/Linux8.0(jessie)

Créer une prise Ethernet

Si vous souhaitez utiliser l'interface Ethernet sous Linux pour la communication socket, vous pouvez préparer la communication socket en écrivant le code suivant.

eth_com.c


     deststr = IP_ADDRESS; //Adresse IP de la destination de la connexion#define IP_ADRESS ("192.168.0.12")
     /*Générer une socket*/
     if((*sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
     {
          printf("fail to create socket\n");
          return -1;
     }

     /*Création d'une structure d'adresse pour le serveur de destination*/
     memset(&server, 0, sizeof(server));
     server.sin_family = PF_INET;
     server.sin_addr.s_addr = inet_addr(deststr);
     server.sin_port = htons(PORT);

     /*Processus de connexion*/
     if(connect (*sock, (struct sockaddr *)&server, sizeof(server)) < 0)
     {
          printf("fail to connect\n");
          return -1;
     }

Cependant, avec ce code, s'il y a plusieurs interfaces Ethernet, une seule interface Ethernet sera utilisée automatiquement. ** Par exemple, s'il y a deux interfaces Ethernet, «eth0» et «eth1», elle sera automatiquement utilisée. Créera une socket en utilisant l'interface "eth0". **

Je veux créer un sokect pour "eth1"

Ici, si vous voulez une communication sockcet à l'aide de l'interface "eth1", spécifiez l'interface avec la fonction setsockopt </ span> .setsockopt () crée un socket` Appel entre socket () '' et le traitement de la connexion connect () ``.

eth_com.c


    deststr = IP_ADDRESS; //Set IP address
     /*Générer une socket*/
     if((*sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
     {
          printf("fail to create socket\n");
          return -1;
     }

     /** For usb-ehternet converter **/
     char *opt;
     opt = "eth1";
     setsockopt(*sock, SOL_SOCKET, SO_BINDTODEVICE, opt, 4);

     /*Création d'une structure d'adresse pour le serveur de destination*/
     memset(&server, 0, sizeof(server));
     server.sin_family = PF_INET;
     server.sin_addr.s_addr = inet_addr(deststr);
     server.sin_port = htons(PORT);

     /*Processus de connexion*/
     if(connect (*sock, (struct sockaddr *)&server, sizeof(server)) < 0)
     {
          printf("fail to connect\n");
          return -1;
     }

Référence: http://stackoverflow.com/questions/3998569/how-to-bind-raw-socket-to-specific-interface

Vous devez l'exécuter à la racine

Cependant, ** Je n'ai pas pu communiquer avec l'interface "eth1" même avec le code ci-dessus. ** Si vous lisez attentivement la page Web mentionnée comme référence,

SO_BINDTODEVICE only works if you run as root, right? (on Linux at least) –  sep332 Nov 27 '12 at 21:29

C'est commenté. En d'autres termes, il semble que vous deviez exécuter avec les privilèges root. </ Span> En l'exécutant avec sudo, je peux désormais communiquer en toute sécurité avec l'interface "eth1".

Recommended Posts

Créer une socket avec une interface Ethernet (eth0, eth1) (Linux, C, Raspberry Pi)
Faites fonctionner l'oscilloscope avec le Raspberry Pi
Créez un compteur de voiture avec Raspberry Pi
Créez une caméra de surveillance WEB avec Raspberry Pi et OpenCV
Utiliser une webcam avec Raspberry Pi
Créer un environnement Tensorflow avec Raspberry Pi [2020]
Faire une minuterie de lavage-séchage avec Raspberry Pi
Créez un convertisseur Ethernet LAN sans fil et un routeur simple avec Raspberry Pi
Créer un système de notification des visiteurs à l'aide de Raspberry Pi
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
Créer un environnement Arch Linux sur Raspai
Créez des serveurs sur Linux et des réseaux locaux avec Raspberry Pi NextCloud et le partage de bureau
Créer un nombre aléatoire avec une densité de probabilité arbitraire
Faire un rappel de parapluie avec Raspberry Pi Zero W
Un mémorandum lors de la réalisation d'une caméra de surveillance avec Raspeye
[Linux] Créez un auto-certificat avec Docker et apache
GPGPU avec Raspberry Pi
DigitalSignage avec Raspberry Pi
Fabriquez un climatiseur intégré à un ordinateur personnel "airpi" avec Raspberry Pi 3!
Créez une partition, puis installez le système d'exploitation Raspberry Pi
J'ai créé un moniteur de ressources pour Raspberry Pi avec une feuille de calcul
getrpimodel: Reconnaître le modèle Raspberry Pi (A, B, B +, B2, B3, etc.) avec python
Créer une application Todo avec Django ① Créer un environnement avec Docker
J'ai fait une caméra de surveillance avec Raspberry PI pour la première fois.
Créer un environnement avec virtualenv
Créer une API avec Django
Créer une page d'accueil avec django
Créer un répertoire avec python
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
[Langage C] [Linux] Essayez de créer une simple commande Linux * Ajoutez simplement! !!
Faisons un ordinateur de vélo avec Raspberry Pi Zero (W, WH)
Classique de Noël (?) Éclairage d'un arbre de Noël avec Raspberry Pi et Philips Hue
Créez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 4
Créer une image de conteneur Docker avec JRE8 / JDK8 sur Amazon Linux
[Remarque] Utilisation d'un écran LCD à 16 caractères à 2 chiffres (1602A) de Python avec Raspeye
Faisons une chemise IoT avec Lambda, Kinesis, Raspberry Pi [Partie 1]