网络数据包的发送分为三种方式,分别是单播、组播、广播。
广播通俗地讲,就是让你的机器发送的数据包可以被同一个网络内的所有主机都接收到。
在讲解如何发送广播包之前,先来看看跟广播有关的知识:
我们都知道IP地址的作用是用来在网络中定位某个网络接口的(没错,准确的讲,IP并不是定位某一台主机)。我们通常见到的IP地址的形式都是如下这样子的:
XXX.XXX.XXX.XXX
这种IP地址的形式叫做点分十进制表示法,其实IP是一个32位长的二进制数,以每8位为单位,共分成4个部分,也就是分成了4个字节。
IP地址的组成方式是: [网络号]+[主机号]
网络号是用来标识某个网络的,而主机号是用来标识网络中的某一台主机的(其实是主机上的某个接口)。
通常计算机发送一个数据包时会在数据包的头部加上发送者的IP地址,和接收者的IP地址。但是一般计算机发送数据包的时候,同一个网络内的所有主机都会收到这个数据包,但是只有那个自己的IP地址和数据包中的接收者的IP地址相同的那个计算机才会真正接收这个数据包。
如果要让网络(同一网络)中的所有计算机都能收到这个数据包,就应该将这个数据包的接收者地址设置为这个网络中的最高的主机号。通常255.255.255.255就可以达到这个要求。所以我们如果要发送一次UDP广播报文,就可以试试如下实例代码:
package main import "net" func main() { // 这里设置发送者的IP地址,自己查看一下自己的IP自行设定 laddr := net.UDPAddr{ IP: net.IPv4(192,168,137,224),Port: 3000,} // 这里设置接收者的IP地址为广播地址 raddr := net.UDPAddr{ IP: net.IPv4(255,255,255),} conn,err := net.DialUDP("udp",&laddr,&raddr) if err != nil { println(err.Error()) return } conn.Write([]byte(`hello peers`)) conn.Close() }
打开WireShark,设定过滤规则为udp.port == 3000, 然后执行一下程序,就可以抓到我们发送的广播包了:
如果转载请注明出处:http://blog.csdn.net/gophers