一、UDP广播地址的计算方法
winsock.h和winsock2.h中都定义了几个特殊的地址:
#define INADDR_ANY 0x00000000
#define INADDR_LOOPBACK 0x7F000001
#define INADDR_BROADCAST 0xFFFFFFFF
#define INADDR_NONE 0xFFFFFFFF
别看到BROADCAST这个词就以为它是广播地址了。广播地址是由IP地址和子网掩码(两者都是4字节)计算出来的。子网掩码的二进制形式是高N位1和低(32-N)位0。IP地址与子网掩码进行按位与操作后得到网络号,网络号相同的IP地址认为在同一网段。
比如对于子网掩码255.255.255.0, 192.168.1.2和192.168.1.3属于同一网段,他们的网络号是192.168.1.0。而他们和192.168.0.4就不属于同一网段,因为后者的网络号为192.168.0.0。但是对于子网掩码255.255.254.0,这三者属于同一网段,他们的网络号为 192.168.0.0。
子网掩码的所有位取反后,与网络号进行同或操作,就是广播地址了。所以广播地址B与IP地址I,子网掩码M的关系为:
B = (I & M)|~M;
二、需要注意的问题
UDP广播之后,发送方的IP也会接收到广播的信息,这就需要做一定的处理,处理可以参考一下几种方式:
1.将自己收到的数据报的IP本地的IP进行比较
2.采用不同的端口接收
3.可以使用多播的方式