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