【发布时间】:2018-07-21 09:23:58
【问题描述】:
我有一个套接字s:
s = socket(AF_PACKET, SOCK_DGRAM, 0);
通过该套接字,我通过loopback 发送带有sendto 的消息。
还有另一个进程在监听127.0.0.1:9999,但它没有收到s发送的数据包。
你知道为什么吗?
我在tcpdump 中看到发送的数据包。地址和端口是正确的。
当我通过socket(AF_INET, SOCK_DGRAM, 0) 等普通套接字发送数据包时,数据包被接收。
你能帮帮我吗?
【问题讨论】:
-
发送者和接收者需要在各自的套接字使用的地址族中相互匹配。听起来接收程序没有使用
AF_PACKET,而是使用AF_INET,这就是它起作用的原因 -
您确定要使用 AF_PACKET 吗?由于您打算使用 UDP,您可能想要使用 AF_INET,或者由于您在 linux 上使用本地通信,您可以使用 AF_UNIX,并使用(临时/固定)文件名作为地址。
-
失败的原因有很多。如果您分享更多源代码,我们可以提供更好的帮助。对于原始 UDP 套接字,我会使用
socket(AF_INET, SOCK_RAW, IPPROTO_UDP)。对于正常的 UDP 通信,我建议使用socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)。
标签: linux raw-sockets