2.2.2 小试牛刀--模拟实现Windows的UDP程序(4)
6. 分析多播消息接收流程
多播消息的接收流程如图2-14所示。此过程用于创建多播套接字、设置套接字、加入多播组等。服务于多播信息发送和接收模块。在程序中,首先创建UDP套接字,然后设置本地地址和多播地址,并将套接字和本地地址绑定;绑定成功后则设置多播数据的TTL值,在默认情况下,TTL值是1。也就是说,多播数据遇到第一个路由器,便会被它放弃,并不允许传出本地网络之外,即只有同一个网络内的多播成员才能收到数据。如果增大TTL值,多播数据就可以经历多个路由器传到其他网络。为了设置TTL值,需要将套接字值设置为IPPROTO_IP,类型为IP_MULTICAST_TTL,当TTL值设置成功后,程序将判断是否允许返还。这是针对发送者而言的,通过设置套接字的IP_MULTICAST_LOOP选项来实现。此选项决定了程序是否接收自己的多播数据,其级别也是RPPRTO_IP。在最后,通过调用WSAJoinLeaf()函数加入指定的多播组。
|
| 图2-14 多播消息控制流程图 |
7. 设计数据结构
在本项目中,并没有定义专门的数据结构,只是在广播和多播中定义的常量和全局变量。
(1) 广播常量有如下两个。
BCASTPORT:广播的端口号,默认是5050。
BCOUNT:广播的最大消息数,用于设置发送或接收的最多消息数量,超过此值将停止发送或接收。默认值是10。
(2) 多播常量有如下4个。
MCASTADDR:是多播组的地址,默认值是224.3.5.8。
MCASTPORT:多播的端口号,默认值是25000。
BUFSIZE:设置缓冲区的大小,默认值是1024。
MCOUNT:设置多播的最大消息数,用于设置发送或接收的最多消息数量,超过此值将停止发送或接收。默认值是10。
(3) 定义广播全局变量。
SOCKET socketBro:广播信息发送端的UDP套接字。
SOCKET socketRec:广播信息接收端的UDP套接字。
struct sockaddr_in addrBro:广播地址结构,其IP地址部分通过另一个全局变量bcastAddr转换而来。
struct sockaddr_in addrRec:接收广播信息的本地地址。
BOOL broadSendFlag:广播信息身份的标志,如果为FALSE,表示是消息接收者,否则是消息发送者。
BOOL broadFlag:广播标志,如果为TRUE,表示该程序进行广播操作。
DWORD bCoun:双字节表示消息数量的变量,该变量的初始赋值为BCOUNT。
DWORD bcastAddr:表示广播地址参数的双字节变量,初始赋值是INADDR_ BROADCAST,表示全1的广播地址,用于接收用户提供的参数。
short bPort:广播的端口号,默认是BCASTPORT。