linux高级编程(广播与组播)
广播与组播:
广播:
局域网,一个人发所有人都能收(服务器找客户端),(发给路由器的广播地址后后路由器自动给所有人发,可用于服务器找客户端)
只能udp来做
setsocketopt:
int setsockopt(SOCKET s, int level, int optname,
const char FAR *optval, int optlen);
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
level指定控制套接字的层次.可以取三种值:
1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项.
optname:需要访问的选项名。
参数很多,不一一列举,主要使用SO_BROADCAST 广播(只能选用UDP,使用TCP时没反应)
optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。
(一般置1打开,0关闭)(需要int on)
optlen:现选项的长度(sizeof(on))
返回值:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EBADF:sock不是有效的文件描述词
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock描述的不是套接字
发送方:(发给路由器看)
广播地址:1.255.255.255.255
2.本机最后一位最大的IP地址(连接到局域网后,前三段是一样的,
最后一位一般为255)
步骤--》
发送方:
1.开广播开关(setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on)); )
2.发给广播地址(sendto(sockfd,buf,strlen(buf),0,(SA)&all,sizeof(all)))
接收方:
1.bind接口地址
2.recv接收即可
组播:
接收方:
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
bind端口
recv接收即可
接收方:
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
bind端口
recv接收即可
需要选定一个组播地址
D类: 组播和广播
224.0.0.0 - 239.255.255.255
192.168.0.255 - 255.255.255.255
235.1.2.3
192.168.1.0
192.168.0.1 网关
192.168.1.255 广播
组播地址结构体:
struct ip_mreqn {
struct in_addr imr_multiaddr; /* 组播地址 */
struct in_addr imr_address; /* 本机IP地址 */(可写INADDR_ANY(值为0.0.0.0),
代表监听本机所有端口,
一般用来表示本机地址)
int imr_ifindex; /* 接口索引 */(网卡,例如ens33,
可写0,代表任意一块网卡)
};
发送方
2.发给组播地址即可
接收方:
1.bind组播接口地址
2.利用组播地址结构体将本机关联进组播地址
struct ip_mreqn multiaddr;
multiaddr.imr_multiaddr.s_addr = inet_addr(MUTIL_ADDR);
multiaddr.imr_address.s_addr = INADDR_ANY;
3.开开关:setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&multiaddr,sizeof(multiaddr)); //第二个参数选择ip选项,IP_ADD_MEMBERSHIP加入组播组
4.接收:recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&sendaddr, &len);
原文地址:https://blog.csdn.net/qq_54094530/article/details/140477767
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!