c - 无法接收自定义以太网帧
问题描述
我创建了一个socket_raw,自定义的协议类型是0x2328,我在另一台机器上发送0x2328类型的数据。抓包可以被抓到,但是recvfrom收不到。我应该怎么办?这是收到的代码。
struct sockaddr_ll sll;
struct ifreq ifr;
if ((sd = socket (PF_PACKET, SOCK_RAW, htons (0x2328))) < 0) {
perror ("socket() failed to get socket descriptor for using ioctl() ");
exit (EXIT_FAILURE);
}
// Use ioctl() to look up interface name and get its MAC address.
memset (&ifr, 0, sizeof (ifr));
sprintf (ifr.ifr_name, "eth1");
if (ioctl (sd, SIOCGIFINDEX, &ifr) < 0) {
perror ("ioctl() failed");
return (EXIT_FAILURE);
}
memset (&sll, 0, sizeof (sll));
int sll_len;
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll_len = sizeof(sll);
char buffer[1024];
recvfrom(sd, buffer, sizeof(buffer), 0, (struct sockaddr *)&sll, &sll_len);
解决方案
推荐阅读
- linux - crontab 无法运行 shell
- mysql - 如何建立 AWS 数据库和 Azure 数据工厂之间的连接?
- python - 获得最大数量的产品给予金钱限制
- java - 在 Apache Ignite 中释放锁定时出现 IllegalMonitorStateException
- flutter - 尝试为 iOS 运行或构建 Flutter 项目时出错
- python - 索引错误:索引 2 超出轴 0 的范围,大小为 2
- java - 使用 Maven 和 logback 配置 Apache Spark 日志记录,最后向 Loggly 抛出消息
- android - 无法在 Firebase 中看到事件
- sql - Oracle SQL - 选择大数字作为十六进制字符串
- javascript - 是否可以使用 getDisplayMedia() 禁用光标记录