Erstellen Sie einen Socket mit einer Ethernet-Schnittstelle (eth0, eth1) (Linux, C, Raspberry Pi).

Hintergrund

In der Sprache Raspberry Pi + C möchte ich manchmal mit zwei Ethernet-Schnittstellen kommunizieren, und es ist ein Memo von dem, was ich damals gelernt habe. Beschreibt, wie ein Ethernet-Socket erstellt und ein Ethernet-Socket angegeben wird. Wir haben den Betrieb in der folgenden Umgebung bestätigt. [Hardware] Raspberry Pi2 Modell B. [OS]Raspbian GNU/Linux8.0(jessie)

Erstellen eines Ethernet-Sockets

Wenn Sie die Ethernet-Schnittstelle unter Linux für die Socket-Kommunikation verwenden möchten, können Sie sich auf die Socket-Kommunikation vorbereiten, indem Sie den folgenden Code schreiben.

eth_com.c


     deststr = IP_ADDRESS; //IP-Adresse des Verbindungsziels#define IP_ADRESS ("192.168.0.12")
     /*Socket generieren*/
     if((*sock = socket (PF_INET, SOCK_STREAM, 0)) < 0)
     {
          printf("fail to create socket\n");
          return -1;
     }

     /*Erstellen einer Adressstruktur für den Zielserver*/
     memset(&server, 0, sizeof(server));
     server.sin_family = PF_INET;
     server.sin_addr.s_addr = inet_addr(deststr);
     server.sin_port = htons(PORT);

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

Bei diesem Code wird jedoch bei mehreren Ethernet-Schnittstellen automatisch eine Ethernet-Schnittstelle verwendet. ** Wenn beispielsweise zwei Ethernet-Schnittstellen vorhanden sind, "eth0" und "eth1", wird diese automatisch verwendet. Erstellt einen Socket über die Schnittstelle "eth0". **

Ich möchte einen Sokect für "eth1" erstellen.

Wenn Sie eine Socket-Kommunikation über die Schnittstelle "eth1" wünschen, geben Sie hier die Schnittstelle mit der Funktion setsockopt an. </ Span> .setsockopt () erstellt einen Socket Aufruf zwischen socket () `und Verbindungsverarbeitungconnect ().

eth_com.c


    deststr = IP_ADDRESS; //Set IP address
     /*Socket generieren*/
     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);

     /*Erstellen einer Adressstruktur für den Zielserver*/
     memset(&server, 0, sizeof(server));
     server.sin_family = PF_INET;
     server.sin_addr.s_addr = inet_addr(deststr);
     server.sin_port = htons(PORT);

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

Referenz: http://stackoverflow.com/questions/3998569/how-to-bind-raw-socket-to-specific-interface

Sie müssen es auf der Wurzel ausführen

** Ich konnte jedoch selbst mit dem obigen Code nicht mit der "eth1" -Schnittstelle kommunizieren. ** Wenn Sie die als Referenz genannte Webseite sorgfältig lesen,

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

Es ist kommentiert. Mit anderen Worten, es scheint, dass Sie mit Root-Rechten ausführen müssen. </ Span> Durch Ausführen mit sudo kann ich jetzt sicher mit der "eth1" -Schnittstelle kommunizieren.

Recommended Posts

Erstellen Sie einen Socket mit einer Ethernet-Schnittstelle (eth0, eth1) (Linux, C, Raspberry Pi).
Bedienen Sie das Oszilloskop mit dem Raspberry Pi
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi
Erstellen Sie eine WEB-Überwachungskamera mit Raspberry Pi und OpenCV
Verwenden einer Webkamera mit Raspberry Pi
Erstellen Sie eine Tensorflow-Umgebung mit Raspberry Pi [2020]
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Erstellen Sie mit Raspberry Pi einen WLAN-Ethernet-Konverter und einen einfachen Router
Erstellen Sie ein Besuchermeldungssystem mit Raspberry Pi
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Erstellen Sie eine Arch Linux-Umgebung auf Raspai
Erstellen Sie Server in Linux und lokalen Netzwerken mit Raspberry Pi NextCloud und Desktop-Sharing
Erstellen Sie eine Zufallszahl mit einer beliebigen Wahrscheinlichkeitsdichte
Machen Sie eine Regenschirmerinnerung mit Raspberry Pi Zero W.
Ein Memorandum bei der Herstellung einer Überwachungskamera mit Raspeye
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
GPGPU mit Raspberry Pi
DigitalSignage mit Raspberry Pi
Machen Sie einen in die Klimaanlage integrierten Personal Computer "airpi" mit Raspberry Pi 3!
Erstellen Sie eine Partition und installieren Sie Raspberry Pi OS
Ich habe einen Ressourcenmonitor für Raspberry Pi mit einer Tabelle erstellt
getrpimodel: Erkennen Sie das Himbeer-Pi-Modell (A, B, B +, B2, B3 usw.) mit Python
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Ich habe zum ersten Mal eine Überwachungskamera mit Raspberry PI gemacht.
Erstellen Sie eine Umgebung mit virtualenv
Erstellen Sie eine API mit Django
Erstellen Sie eine Homepage mit Django
Erstellen Sie ein Verzeichnis mit Python
Steuern Sie den Motor mit einem Motortreiber mit Python auf Raspberry Pi 3!
[C-Sprache] [Linux] Versuchen Sie, einen einfachen Linux-Befehl zu erstellen. * Fügen Sie einfach hinzu! !!
Machen wir einen Fahrradcomputer mit Raspberry Pi Zero (W, WH)
Weihnachtsklassiker (?) Einen Weihnachtsbaum mit Raspberry Pi und Philips Hue anzünden
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 4 sichtbar
Erstellen Sie ein Docker-Container-Image mit JRE8 / JDK8 unter Amazon Linux
[Hinweis] Verwenden eines 16x2-stelligen LCD-Zeichens (1602A) von Python mit Raspeye
Machen wir ein IoT-Shirt mit Lambda, Kinesis, Raspberry Pi [Teil 1]