广播实现一对多的通讯
它通过向广播地址发送数据报文实现的
1、套接字选项
套接字选项用于修饰套接字以及其底层通讯协议的各种行为。函数setsockopt
和getsockopt
可以查看和设置套接字的各种选项。
#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
//成功后,返回0。出现错误时,返回-1
2、SO_BROADCAST选项
控制着UDP套接字是否能够发送广播数据报,选项的数据类型为int,非零意味着“是”,注意,只有UDP套接字可以使用这个选项,TCP是不能使用广播的。
int opt=1;
if(sockfd=socket(AF_INET,SOCK_DGRAM,0)<0)
{
//错误处理
}
if(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt))<0)
{
//错误处理
}
3、SO_SNDBUF和SO_RCVBUF选项
每一个套接字有一个发送缓冲区和接收缓冲区,这两个缓冲区由底层协议使用,接收缓冲区存放由协议接收的数据直到应用程序读走,发送缓冲区存放应用写出的数据直到被协议发送出去。SO_SNDBUF
和SO_RCVBUF
选项分别控制发送和接收缓冲区的大小,它们的类型均为int,以字节为单位。
int opt=1;
if(sockfd=socket(AF_INET,SOCK_STREAM,0)<0)
{
//错误处理
}
if(getsockopt(sockfd,SOL_SOCKET,SO_SUDBUF,&opt,sizeof(opt))<0)
{
//错误处理
}
opt+=2048;
if(setsockopt(sockfd,SOL_SOCKET,SO_SUDBUF,&opt,sizeof(opt))<0)
{
//错误处理
}
4、广播地址
如果用{net ID,subnet ID,host ID}({网络ID,子网ID,主机ID})
表示IPV4地址,那么有四类的广播地址,我们用-1表示所有比特都为1的字段
子网广播地址:{net ID,subnetID,-1}.。这类地址编排指定子网上的所有接口。例如,如果我们对B类地址192.168采用8位子网ID,那么192.168.2.255将是192.168.2子网上所有接口子网广播地址。路由器通常不转发这类广播。
全部子网广播地址:{netID,-1,-1}。这类广播地址编排指定网络上的所有子网。如果说这类地址曾被用过的话,那么现存已很少见了。
受限广播地址:{-1,-1,-1}或255.255.255.255.路由器从不转发目的地址255.255.255.255.的IP数据报。