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)
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". **
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
** 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