【发布时间】:2014-02-21 09:09:13
【问题描述】:
我的意图是编写一个函数,该函数将保存整个以太网帧的缓冲区作为参数,并将其发送到原始套接字(仅用于传输)。
这里有明显的步骤:
sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
// ...
write(sockfd, buffer, buffer_len);
// ...
close(sockfd);
但是写入函数失败并出现 EXNIO 错误代码:“没有这样的设备或地址”。我从 Wireshark 会话中获取数据包内容,因此它的格式应该很好。
互联网上有几个关于发送原始 eth 数据包的示例,但我没有找到任何使用 write() 而不是 sendto() 的示例,这需要填充 sockaddr_ll 结构。
有人遇到过同样的问题吗?使用 sendto() 是完成任务的唯一方法吗?
谢谢。
注意:程序以 root 身份运行。
【问题讨论】: