【问题标题】:How to send an IP packet to directly connected Peer through broadcast?如何通过广播将IP数据包发送到直接连接的Peer?
【发布时间】:2018-01-30 21:19:33
【问题描述】:

让我们两台机器直接连接在一个点对点的链路上:

A -192.168.4.1/24---------------------------192.168.4.2/24--B

A如何仅通过广播向B发送IP数据包?

如果 A 用 Dest mac = ff:ff:ff:ff:ff:ffdest ip : 192.168.4.255 制作数据包,这会使数据包发往 B 吗?如果是,有人可以解释一下这是如何工作的吗?

【问题讨论】:

  • 不要手动设置IP头。使用像sendto()这样的标准套接字函数将数据包发送到A的子网的广播IP,您可以通过使用按位AND运算符使用其子网掩码屏蔽A的IP来确定,然后使用添加掩码的倒数一个按位的OR 运算符(即((192.168.4.1 and 255.255.255.0) or 0.0.0.255) = 192.168.4.255)。或者,使用系统函数,如getifaddrs() 或等效函数,直接查询 A 的网络适配器以获取其广播 IP。无论哪种方式,如果 B 连接到并侦听同一子网,它将接收数据包,是的。
  • 如果你仍然想从头开始创建数据包,我会推荐 scapy,例如:send(Ether()/IP(dst='192.168.4.255')/ICMP()/"test packet")
  • @RemyLebeau 这就是我正在尝试的。不手动准备 IP hdr,并使用 sendto() API 以 dest ip = 192.168.4.255 将数据包发送到 B。但是发送到返回 -1 - 即数据包甚至没有发送出去。当我将 192.168.4.255 替换为 192.168.4.2 时,数据包的发送和接收没有任何问题。 errno 被设置为 13(权限被拒绝)
  • 好的,我想通了,我需要使用 'setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); 设置我的套接字上的广播权限;

标签: sockets networking broadcast unicast


【解决方案1】:

我想通了 - 我们可以发送 dest IP = 192.168.4.255 的数据包。另外,设置socket的广播权限使用

int on=1;
setsockopt(igmp_sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

它会起作用的。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2011-10-08
    • 2014-06-26
    • 2013-10-05
    • 1970-01-01
    • 2014-03-07
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多