POSIXy C++에서 레이어 2 패킷을 수신하려면 어떻게해야합니까? 패킷에는 src 및 dst MAC 주소, 유형/길이 및 사용자 정의 형식의 데이터 만 있습니다. 그들은 TCP 나 UDP 또는 IP 나 IGMP 나 ARP 등이 아닙니다. 그들은 하드웨어 사용자들에 의해 제게 제공되는 양식입니다.C/C++에서 원시 레이어 2 패킷을 어떻게 받습니까?
내 socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)
은 recvfrom()
에서 반환하지 않습니다.
잘 보낼 수 있지만 네트워크 스택에서 어떤 옵션을 선택하든 관계없이 수신 할 수 없습니다.
(플랫폼 Vx 웍스,하지만 난 POSIX 또는 Linux 또는 무엇이든을 ... 번역 할 수 있습니다)
코드 (현재의 화신)가 나타납니다
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
대단한 질문입니다! –
이 POSIX, Windoze에서 이것을 행하려고 행운을 빈다.) –
POSIX는 C++ 바인딩을 정의하지 않고 오직 C 만 정의한다. –