我有一个套接字s
:
s = socket(AF_PACKET, SOCK_DGRAM, 0);
并使用该套接字,通过sendto
发送带有loopback
的消息。
还有一个进程正在监听127.0.0.1:9999
,但是它不接收s
发送的数据包。
你知道为什么吗?
我在tcpdump
中看到发送的数据包。地址和端口正确。
当我通过socket(AF_INET, SOCK_DGRAM, 0)
之类的通用套接字发送数据包时,该数据包就被接收了。
你能帮我吗?
答案 0 :(得分:0)
您的协议为0,在大多数情况下都可以,但是对于AF_PACKET来说效果不佳。来自“ man packet”:“协议是以网络字节顺序排列的IEEE 802.3协议编号。有关允许的协议列表,请参阅包含文件。”由于您尝试发送IP流量,因此需要从那里发送ETH_P_IP,即0x0800而不是零。
这告诉接收操作系统将数据包路由到内核中的IP堆栈。我相信Wireshark在以太网层将其标记为Type。应该可以在那里看到它。