Come si ricevono i pacchetti di livello 2 in POSIXy C++? I pacchetti hanno solo indirizzo MAC src e dst, tipo/lunghezza e dati formattati personalizzati. Non sono TCP o UDP o IP o IGMP o ARP o altro - sono un formato fatto in casa dai ragazzi dell'Hardware.Come si ricevono pacchetti raw, layer 2 in C/C++?
Il mio socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)
non torna mai dal suo recvfrom()
.
Posso inviare correttamente, non riesco a ricevere tutte le opzioni che scelgo nello stack di rete.
(Platform è VxWorks, ma posso tradurre POSIX o Linux o qualunque cosa ...)
codice di ricezione (attuale incarnazione):
int s;
if ((s = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) < 0) {
printf("socket create error.");
return -1;
}
struct ifreq _ifr;
strncpy(_ifr.ifr_name, "lltemac0", strlen("lltemac0"));
ioctl(s, IP_SIOCGIFINDEX, &_ifr);
struct sockaddr_ll _sockAttrib;
memset(&_sockAttrib, 0, sizeof(_sockAttrib));
_sockAttrib.sll_len = sizeof(_sockAttrib);
_sockAttrib.sll_family = AF_PACKET;
_sockAttrib.sll_protocol = IFT_ETHER;
_sockAttrib.sll_ifindex = _ifr.ifr_ifindex;
_sockAttrib.sll_hatype = 0xFFFF;
_sockAttrib.sll_pkttype = PACKET_HOST;
_sockAttrib.sll_halen = 6;
_sockAttrib.sll_addr[0] = 0x00;
_sockAttrib.sll_addr[1] = 0x02;
_sockAttrib.sll_addr[2] = 0x03;
_sockAttrib.sll_addr[3] = 0x12;
_sockAttrib.sll_addr[4] = 0x34;
_sockAttrib.sll_addr[5] = 0x56;
int _sockAttribLen = sizeof(_sockAttrib);
char packet[64];
memset(packet, 0, sizeof(packet));
if (recvfrom(s, (char *)packet, sizeof(packet), 0,
(struct sockaddr *)&_sockAttrib, &_sockAttribLen) < 0)
{
printf("packet receive error.");
}
// code never reaches here
domanda Impressionante! –
Sono contento che hai contrassegnato questo POSIX, buona fortuna cercando di fare questo su Windoze;) –
Solo un nitpick: POSIX non definisce binding C++, solo C. –