通过环回中的原始套接字发送UDP数据包

时间:2018-07-21 09:23:58

标签: linux raw-sockets

我有一个套接字s

s = socket(AF_PACKET, SOCK_DGRAM, 0);

并使用该套接字,通过sendto发送带有loopback的消息。

还有一个进程正在监听127.0.0.1:9999,但是它不接收s发送的数据包。

你知道为什么吗?

我在tcpdump中看到发送的数据包。地址和端口正确。 当我通过socket(AF_INET, SOCK_DGRAM, 0)之类的通用套接字发送数据包时,该数据包就被接收了。

你能帮我吗?

1 个答案:

答案 0 :(得分:0)

您的协议为0,在大多数情况下都可以,但是对于AF_PACKET来说效果不佳。来自“ man packet”:“协议是以网络字节顺序排列的IEEE 802.3协议编号。有关允许的协议列表,请参阅包含文件。”由于您尝试发送IP流量,因此需要从那里发送ETH_P_IP,即0x0800而不是零。

这告诉接收操作系统将数据包路由到内核中的IP堆栈。我相信Wireshark在以太网层将其标记为Type。应该可以在那里看到它。