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

相关推荐

  1. linux高级编程广播

    2024-07-17 03:38:01       23 阅读
  2. 广播

    2024-07-17 03:38:01       32 阅读
  3. RPC 集群,gRPC 广播

    2024-07-17 03:38:01       53 阅读
  4. 地址MAC的换算

    2024-07-17 03:38:01       41 阅读
  5. Linux网络编程:多的使用

    2024-07-17 03:38:01       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 03:38:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 03:38:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 03:38:01       58 阅读
  4. Python语言-面向对象

    2024-07-17 03:38:01       69 阅读

热门阅读

  1. hexdump -C 实现

    2024-07-17 03:38:01       24 阅读
  2. 掌握Conda包管理:精通版本控制的艺术

    2024-07-17 03:38:01       20 阅读
  3. 【ubuntu】没有声音??连不上网络???

    2024-07-17 03:38:01       17 阅读
  4. bat 设置防火墙指定ip范围 指定时间段放行访问

    2024-07-17 03:38:01       18 阅读
  5. 微信小程序实现省市区级联选择组件

    2024-07-17 03:38:01       21 阅读
  6. Linux硬件中断(IRQ)的基础知识

    2024-07-17 03:38:01       19 阅读