Làm cách nào để nhận các gói lớp 2 trong POSIXy C++? Các gói chỉ có địa chỉ MAC và dst, loại/độ dài và dữ liệu được định dạng tùy chỉnh. Chúng không phải là TCP hoặc UDP hoặc IP hoặc IGMP hay ARP hay bất cứ thứ gì - chúng là một định dạng được pha chế tại nhà cho các phần cứng của tôi.Làm cách nào để nhận các gói dữ liệu thô, lớp 2 trong C/C++?
My socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)
không bao giờ trả về từ số recvfrom()
.
Tôi có thể gửi tiền phạt, tôi chỉ không thể nhận được bất kể tôi chọn tùy chọn nào trong mạng.
(Platform là VxWorks, nhưng tôi có thể dịch POSIX hoặc Linux hoặc bất cứ điều gì ...)
nhận được mã (hóa thân hiện tại):
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
Câu hỏi tuyệt vời! –
Tôi rất vui vì bạn đã gắn thẻ POSIX này, chúc may mắn cố gắng thực hiện điều này trên Windoze;) –
Chỉ cần một nitpick: POSIX không xác định ràng buộc C++, chỉ C. –