目录

1、单播 / 广播 / 组播 的概念

(1) 单播

(2) 广播

(3) 多播(组播)

2、广播 socket编程(只能是UDP通信)

3、多播 socket编程(只能是UDP通信)


1、单播 / 广播 / 组播 的概念

(1) 单播

之前在进行UDP和TCP编程的时候,客户端把数据发送到指定IP地址,此时接收方只有一个,这种数据包发送方式称为“单播”。

(2) 广播

如果是把数据发送某个局域网中的所有主机,这种数据包的发送方式称为“广播”

  • 发送出去的数据会被 广播地址所在网段的所有主机接收
  • 每个局域网的最大主机地址代表该网段的广播地址。
    • 以192.168.1.0 (255.255.255.0) 网段为例,192.168.1.255代表该网段的广播地址
  • 255.255.255.255 在所有网段中都代表广播地址。
    • 如果主机A向 255.255.255.255 发数据,那么当前局域网里的所有主机都会收到数据。

(3) 多播(组播)

如果是把数据发送给某个局域网中的一组IP地址,这种发送方式称为“多播”,这个组称为“多播组”,只有加入多播组的主机才能收到数据。

  • 广播是发给某一局域网中的所有主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。
  • 多播是一种折中的方式,既能发送给多个主机,又能避免象广播那样带来过多的负载

2、广播 socket编程(只能是UDP通信)

广播socket编程的侧重点在发送方(客户端),而且只有使用UDP协议才能广播。接收方的代码可以沿用单播的代码。发送方的数据发送步骤如下:

  • 创建用户数据报套接字
  • 套接字默认不允许广播数据包(因为可能引发广播风暴),需要使用 setsockopt设置属性
  • 目标地址(接收方地址) 指定为广播地址
  • 指定目标端口
  • 发送数据包
#define DST_PORT 9090/* 1. 创建socket fd */
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {   //UDP编程perror ("socket");exit (1);
}/* 2. 允许广播设置 */
int b_br = 1;
setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));/*3. 指定目标IP和端口号填充 */
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin))
sin.sin_family = AF_INET;
sin.sin_port = htons (SERV_PORT);                    //网络字节序的端口号
sin.sin_addr.s_addr = inet_addr("192.168.11.255");    // 广播地址/*4. 发送数据 */
char buf[128] = {'1','2','3','4','5','6','\0'};
sendto (fd, buf, strlen(buf), 0, (struct sockaddr *)&sin, sizeof(sin));

3、多播 socket编程(只能是UDP通信)

多播socket编程的侧重点在接收方(服务端),接收方要创建一个多播组(类似于QQ群),然后把当前套接字加入到多播组中;而发送方发送数据的目标地址不是服务端的IP地址,而是多播组的IP地址。

  • 创建数据报套接字
  • 绑定IP地址和端口号
  • 创建多播组(类似于创建QQ群)
  • 将当前套接字加入到多播组(类似于加群)
  • 接收数据
#define SERV_PORT 9090
#define MULTICAST_IP "192.168.11.170"
#define BUFSIZE 128int fd = -1;/* 1. 创建socket fd */
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {   //udp程序perror ("socket");exit (1);
}/* 2. 绑定IP地址和端口号 */
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin))
sin.sin_family = AF_INET;
sin.sin_port = htons(SERV_PORT);            // 网络字节序的端口号
sin.sin_addr.s_addr = htonl(INADDR_ANY);    // 服务端可以绑定任意IP
if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("bind");exit (1);
}/* 3. 创建多播组,初始化多播组结构体 */
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq))
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IP);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);/* 4. 把当前套接字加入到多播组 */
setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));/* 5. 接收数据 */
char buf[BUFSIZE ];
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
recvfrom (fd, buf, BUFSIZE - 1, 0, (struct sockaddr *)&cin, &addrlen);

广播、组播 socket编程相关推荐

  1. python socket编程 ws2tcpip_Python3组播通信编程实现教程(发送者+接收者)

    一.说明 1.1 标准组播解释 通信分为单播.多播(即组播).广播三种方式 单播指发送者发送之后,IP数据包被路由器发往目的IP指定的唯一一台设备的通信形式,比如你现在与web服务器通信就是单播形式 ...

  2. 域服务器广播消息,广播,组播和UNIX域套接字

    1.广播 1.特点 一对多 仅能使用UDP 2.概念 发送方只有一个接收方则称单播 如果同时发给局域网中的所有主机,成为广播 只有用户数据包(使用UDP协议)套接字才能广播 广播地址 1.以192.1 ...

  3. windows7 python 指定源组播 10049_Python3组播通信编程实现教程(发送者+接收者)

    一.说明 1.1 标准组播解释 通信分为单播.多播(即组播).广播三种方式 单播指发送者发送之后,IP数据包被路由器发往目的IP指定的唯一一台设备的通信形式,比如你现在与web服务器通信就是单播形式 ...

  4. 【软件通信协议】2. 详细解析UDP通信协议(附广播 组播)

    1. UDP协议简介 UDP是User Datagram Protocol的简称,全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议.在OSI模型中,在第四层--传输层 ...

  5. java udp 广播 组播_UDP广播和组播的基础知识介绍

    UDP广播和组播的基础知识介绍 ━━━━━━━━━━━━━━━━━━━━━━━━━ UDP可以实现一对多的传输方式,即通过广播和组播把数据发送给一组进程.下面就介绍下UDP广播和组播的相关知识. 一. ...

  6. 单播 广播 组播_【技术解析】关于组播概念那些你需要知道的~

    点击蓝字关注我 今天,小盟带大家继续学习一下组播知识~ 一.IGMP Message 1.组成员一旦开启IGMP,会自动发送Membership Report消息到叶路由器 2.IGMPv2版本,组成 ...

  7. 单播 广播 组播_组播概念3

    一.IGMP Message 1.组成员一旦开启IGMP,会自动发送Membership Report消息到叶路由器 2.IGMPv2版本,组成员退出组会发送leave消息,IGMPv1不会 3.也就 ...

  8. UDP通信多发多收(案例)和广播组播

    使用UDP通信方式开发接收端和发送端(模拟视频弹幕系统) 分析:发送端可以一直发送消息   接收端可以不断的接收多个发送端的消息展示     发送端输入exit则结束发送端程序 UDP的接收端为什么可 ...

  9. 单播 广播 组播区别

    一:通信方式分类 在IPv4网络中,主机可采用的通信方式有如下三种: 1.单播:单台主机与单台主机之间的数据通信 带宽端口有多少台就发多少个数据 2.广播:单台主机向网络中所有主机发送数据包的过程 发 ...

最新文章

  1. TensorRT Samples: CharRNN
  2. Android 知识点梳理
  3. 防患高通效仿华为,苹果10亿美元收购英特尔手机基带业务!打造5G备胎,加强自主可控...
  4. 计算机背景为什么总是黑色,电脑背景变成黑色的了是为什么
  5. js 把线性的数据结构改成树形结构
  6. FileZilla Pro32位64位官方安装版 v3.50.0
  7. 攀达计算机usb控制器,[如何用注册表打开被屏蔽的USB插口.docx
  8. 又一国产新机定价逆天!网友:千万不要作...
  9. linux怎么使用git安装目录,Linux系统中怎么安装Git?
  10. 如何导出项目到本地_如何在win10中导入/导出组策略设置,这个技巧很实用
  11. 基于PHP构建OAuth 2.0 认证平台
  12. 当有多个click事件时的简易做法
  13. 极客大学产品经理训练营 认识产品经理上 第1课总结
  14. 欧姆龙CP1H+CIF11与施耐德ATV变频器通讯程序
  15. java清空表格怎么实现_Java 创建、删除、操作PPT中的表格
  16. 文件备份云服务器,文件备份云服务器
  17. 短信链接复制搜索公众号,短信如何推广公众号?
  18. 怎么把excel表格转换成word格式
  19. ztext - 简单几行代码创建酷炫 3D 特效文字的开源 JS 库
  20. linux下下载openwrt源码,OpenWrt下载编译

热门文章

  1. Android 图片模糊、高斯模糊、毛玻璃的三种实现方法
  2. 对一段信号用对称分量法matlab,《数字信号处理》课程设计题目
  3. Git使用-从一个git仓库迁移到另外一个git仓库
  4. java密码复杂度匹配规则
  5. 面向对象的三大特性是什么
  6. 如何使用Python进行图形化编程
  7. 给ROCK64安装opencv3(Ubuntu,Debian)
  8. ushort mysql,Mysql的CodeFirst:不支持ushort、uint、ulong的字段提示不足
  9. 神经网络学习(三)比较详细 卷积神经网络原理、手写字体识别(卷积网络实现)
  10. 使用洋铭SE-500HD切换台进行多机位切换画面现场直播搭建详解教程