【问题标题】:Sending an UDP packet by raw socket in loopback在环回中通过原始套接字发送 UDP 数据包
【发布时间】: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


【解决方案1】:

您有 0 表示协议,在大多数情况下都可以正常工作,但对于 AF_PACKET 则不是很好。来自“man packet”:“protocol 是网络字节顺序中的 IEEE 802.3 协议号。有关允许的协议列表,请参见包含文件。”由于您正在尝试发送 IP 流量,因此您需要从那里获得 ETH_P_IP,它是 0x0800 而不是零。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2017-02-25
    • 1970-01-01
    相关资源
    最近更新 更多