UDP广播通信特点:
1.数据传输不用建立连接,所以不可靠(符合udp协议的特点)
2.数据的发送是面向整个子网的,任何一台在子网内的计算机都可以接收到相同的数据;
3.广播用于udp和原始IP,不能用于TCP
广播地址:
广播地址是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机号为全1的IP地址为广播地址。例如,对于 :192.168.199.0(掩码:255.255.255.0)网段,其广播地址为192.168.199.255 (255 即为2进制的11111111 ),当发出一个目的地址为192.168.199.255的分组时,它将被分发给该网段上的所有计算机。
本地广播: 地址就是255.255.255.255,它不经路由转发,发送本地网络下的所有主机,只能在局域网内转发,主要是不用知道目标主机的掩码与网络地址,本地转发同本地网络下的所有主机。
直接广播: 计算方法通过主机的掩码与网络地址计算出来。掩码最后为0的位为主机位。掩码与网络地址相与,然后主机位全变为1,就是直接广播地址。这样改网络地址下的所有主机都能接收到广播。
两者的区别就是,本地广播在不知道目标主机的网络地址下,如果目标主机是在本地网络,可以发送本地广播,本地网络下的所有主机都能接收广播。直接广播是目标主机的网络地址知道,那该网络地址网段下的所有主机都能收到广播,直接广播更精确范围更小些。
以下为本地广播示例:
发送端,发送的地址,255.255.255.255:Port,即,IPAddress.Broadcast:Port
private void button1_Click(object sender, EventArgs e)
{
Thread sendThread = new Thread(new ThreadStart(SendThread));
sendThread.IsBackground = true;
sendThread.Start();
}
void SendThread()
{
//定义udp客户端绑定本地网络地址及端口
UdpClient UDPsend = new UdpClient(new IPEndPoint(“192.168.1.10”, 8080))
IPEndPoint endpoint = new IPEndPoint(IPAddress.Broadcast, 8080);
//其实 IPAddress.Broadcast 就是 255.255.255.255
byte[] buf = Encoding.Default.GetBytes("This is UDP broadcast");
while (true)
{
UDPsend.Send(buf, buf.Length, endpoint);
richTextBox1.Invoke(new Action(() => {
this.richTextBox1.AppendText("This is UDP broadcast"+ "\r\n");
}));
Thread.Sleep(1000);
}
}
接收端,接收的地址,0.0.0.0:Port,即,IPAddress.Any:Port
private void button2_Click(object sender, EventArgs e)
{
Thread receThread = new Thread(new ThreadStart(RecvThread));
receThread.IsBackground = true;
receThread.Start();
}
void RecvThread()
{
//定义udp接受端,绑定本地网络地址及端口
UdpClient UDPrece = new UdpClient(new IPEndPoint("192.168.11.11", 8080));
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byte[] buf = UDPrece.Receive(ref endpoint);
string msg = Encoding.Default.GetString(buf);
richTextBox1.Invoke(new Action(() => {
this.richTextBox2.AppendText(msg + "\r\n");
}));
}
}