【发布时间】: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:ff 和 dest 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