自学内容网 自学内容网

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)!