介绍
实际上,udp广播包是将udp数据报发送到整个局域网,而不是单个目的终端。发送udp广播包时,要记住发送频率,否则容易形成广播风暴,导致局域网的网络瘫痪。如果一个局域网有多个网段,其他局域网的广播包就不能被不同的网段接收到。以下是基于udp广播的echo服务。这是一个很简单的例子,分为服务器端和客户端。
密码
因为是windows下的网络编程开发,所以先对网络环境进行初始化,使用WSAStartup API初始化和WSACleanup反初始化来清理资源。记住,在windows下的网络编程开发中,如果不使用WSAStartup进行初始化,其他winsock API调用都会失败。
windows网络环境初始化接下来,getUdpBroadCastSocket方法创建一个udp套接字。首先调用socket函数,使用参数SOCK_DGRAM创建一个基于AF_INET协议族的数据报套接字。如果SOCK_DGRAM被SOCK_STREAM替换,则创建一个tcp套接字。udp socket创建完成后,我们还需要将这个socket的属性设置为SO_BROADCAST广播类型,否则仍然无法发送udp广播。SIO_UDP_CONNRESET的属性设置为修复windows bug,偶尔会在接收到的数据中返回10054错误。
创建udp广播套接字我们先写udp广播服务器的代码,然后把udp广播套接字绑定到一个端口和ip。然后循环调用recvfrom接收数据,直接调用sendto将接收到的数据返回给发送方。发送方的用户信息存储在addrFrom结构中,该结构包含用户的ip和端口信息。
udp广播服务端创建流程然后是客户端创建过程。首先调用getUdpBroadCastSocket创建一个udp广播套接字,然后定义一个SOCKADDR_IN结构来存储服务器的端口和广播ip信息,然后调用sendto向这个地址发送信息。如果对方给你回复,recvfrom就可以接收到对方发回来的消息。
udp广播客户端创建流程Udp客户端运行代码。
udp广播客户端Udp广播服务器运行代码。
udp广播服务端摘要
分别编译运行以上代码,可以看到服务器已经实现了客户端信息的正常回显,并显示了ip和端口。客户端将接收服务器返回的消息,内容与发送出去的一致,并输出服务器的ip信息和端口。
如果要使用udp广播包来处理一个任务,需要在udp的基础上将socket属性设置为SO_BROADCAST,这样程序就会以广播的形式发送数据。有时候在接收udp广播包的过程中经常会收到10054的错误,所以在设置UDP socket属性时设置SiO _ udp _ Connreset属性,避免出现10054的错误,这是windows系统bug导致的问题。如需了解更多网络编程知识,欢迎关注我。谢谢你。