View Full Version : [C/C++] Linux Raw Socket con due NIC
Devo realizzare un simulatore di dispositivi slave ethercat e ho la necessità di aprire due socket in modalità RAW, uno su una nic e l'altro su di un'altra.. Il problema è che non so come dire alla system call socket (inizializzata come SOCK_RAW e protocollo ETH, dato che EtherCAT è incapsulato in Ethernet), di aprirne uno da una parte e uno dall'altra..qualcuno sa come si possa fare?
Grazie anticipatamente per la considerazione!
devi usare la system call bind per bindare un socket da una parte e uno dall'altra subito dopo la socket, ma non saprei dirti di piu...
Come sempre, grazie fero86! :) Cercando anche altrove, in effetti, avevo trovato la bind, ma in tutti gli esempi si basano sull'IP della NIC..cosa che io non posseggo.. Continuo a cercare..nel caso trovassi qualcosa, posterò qui la soluzione..magari potrà servire ad altri in futuro!
Questa DOVREBBE essere la soluzione al problema (per una volta il "mi sento fortunato" di google mi ha aiutato!)
tratto da man 7 socket (http://linux.die.net/man/7/socket):
These socket options can be set by using setsockopt(2) and read with getsockopt(2) with the socket level set to SOL_SOCKET for all sockets:
SO_BINDTODEVICE
quindi si farà qualcosa del tipo (con riserva sulla sintassi..non ho il codice vero e proprio sottomano!)
char[] device="eth1";
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
struct sockaddr_ll socket_address;
socket_address.sll_family = AF_PACKET;
socket_address.sll_protocol = htons(ETH_P_ALL);
//parte interessante allo scopo
setsockopt(s,SOL_SOCKET,SO_BINDTODEVICE,device,sizeof(device));
bind(s, (struct sockaddr *) & socket_address, sizeof(socket_address));
recvfrom(s, buffer, ETH_FRAME_LEN, 0, NULL, NULL);
La soluzione era più semplice del previsto..basta dirgli "eth0" o qualsiasi altra interfaccia desiderata, e lui la binda! Mi aspettavo chissà cosa..per una volta sono colpito positivamente! :)
Devo realizzare un simulatore di dispositivi slave ethercat e ho la necessità di aprire due socket in modalità RAW, uno su una nic e l'altro su di un'altra.. Il problema è che non so come dire alla system call socket (inizializzata come SOCK_RAW e protocollo ETH, dato che EtherCAT è incapsulato in Ethernet), di aprirne uno da una parte e uno dall'altra..qualcuno sa come si possa fare?
Grazie anticipatamente per la considerazione!
Ciao,
ho trovato questo post cercando informazioni su simulatori ethercat, non so se questo è il posto giusto ma qualcuno saprebbe dirmi se è possibile realizzare uno slave ethercat software simulato appoggiandosi ad una normale scheda ethernet RJ45? Se esiste il modo mi sapreste dire dove posso recuperare informazioni e/o esempi?
Grazie!
Ciao!!
Ciao,
ho trovato questo post cercando informazioni su simulatori ethercat, non so se questo è il posto giusto ma qualcuno saprebbe dirmi se è possibile realizzare uno slave ethercat software simulato appoggiandosi ad una normale scheda ethernet RJ45? Se esiste il modo mi sapreste dire dove posso recuperare informazioni e/o esempi?
Grazie!
Ciao!!
Guarda..è a grandi linee quello che dobbiamo fare io e un mio compagno di corso per una tesina! :)
A grandi linee quello che devi fare è:
- aprire un socket in modalità RAW (questo perchè NON vuoi modifiche al pacchetto da parte della NIC)
- elaborarti il pacchetto (estrarre header, comando, working counter, indirizzamenti e quant'altro)
- fare la simulazione che devi fare
- rispedirla
Una cosa molto ovvia che a noi ha portato via tempo a causa dell'interfacciamento con flex/bison che necessitano di testo in chiaro (leggi: ascii) per funzionare, altrimenti, ci metti poco tempo. Hai la documentazione ethercat? Se no, se mi dai una mail - in pvt - ti giro il pdf!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.