计算机网络 | 广播与组播

这篇具有很好参考价值的文章主要介绍了计算机网络 | 广播与组播。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算机网络 | 广播与组播

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。



专栏:《Linux从小白到大神》《网络编程》


首先需要明确的是,广播和组播都是UDP的属性,在TCP中是没有的。

1. 广播

广播的例子随处可见,比如说把屏幕共享给很多人,其实也是广播,首先把屏幕截图,然后广播给所有的客户端,比如说屏幕共享软件,一般都有一个广播地址,只要在同一个网段的客户端都能收到广播,如果设置广播地址为255.255.255.255,那么不管哪个网段都能收到广播。屏幕共享软件会把当前屏幕截图并分为很多小块,然后压缩,广播给所有客户端,客户端再进行解压。

广播的工作过程:

  • 服务器

    • 创建套接字 —— socket

    • fd绑定服务器IP和端口

    • 初始化客户端IP和端口信息

      • struct sockaddr_in cli;
      • cli.sin_family = af_inet;
      • cli.port = htons(9898);
      • inet_pton(af_inet, “xxx.xxx.123.255”, &cli.adr);
    • 发送数据:sendto()
    • 设置广播权限(给服务器,server虽然设置了广播地址,但是默认是没有广播权限的)
      • setsockopt();
  • 客户端

    • 创建套接字
    • 显式绑定IP和端口

      • bind();
    • 接收数据 —— server数据

      • recvform();
  • 适用范围

    • 只适用于局域网

计算机网络 | 广播与组播

server只发数据(主动),client只收数据(被动)。不管client想不想接收,server都会发,只要client在server的发送范围内(局域网),就必须收。UDP发送数据需要client的IP和port,而每个client都有自己的不同的IP,所以server需要一个广播地址,只要把数据发送到这个广播地址,所有在同一网段的client都可以收到,同时需要绑定一个固定端口。如果是同一台主机测试广播的话,server和client应该用不同的端口(一个端口只能给一个进程用),如果server和client是不同的主机,那就无所谓了。

计算机网络 | 广播与组播

计算机网络 | 广播与组播

2. 组播

组播也叫做多播,组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。

  • 组播的适用范围

    • 局域网
    • Internet —— 广域网
  • 组播地址

    • 224.0.0.0~224.0.0.255 —— 预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用。
    • 224.0.1.0~224.0.1.255 —— 公用组播地址,可以用于Internet,想要使用需申请。
    • 224.0.2.0~238.255.255.255 —— 用户可用的组播地址(临时组地址),全网范围内有效。
    • 239.0.0.0~239.255.255.255 —— 本地管理组播地址,仅在特定的本地范围内有效。
  • 两个结构体

    struct ip_mreqn
    {
    	// 组播组的IP地址,即组播地址。
        struct 	in_addr imr_multiaddr; 
        // 本地某一网络设备接口的IP地址。
        struct 	in_addr imr_interface; //设置 0.0.0.0 自动适配本机IP   
    	int   	imr_ifindex; // 网卡编号
    };
    struct in_addr 
    {
    	in_addr_t s_addr;
    };
    

使用函数可以通过网卡名字获取网卡编号

unsigned if_nametoindex(const char *ifname); //根据网卡名字获取网卡编号

计算机网络 | 广播与组播

组播示意图如下:

计算机网络 | 广播与组播

server指定一个组播地址,并向组播地址发送数据,client要想接收数据就要加入这个组播地址。

server

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <net/if.h>

#define SERVER_PORT 6666
#define CLIENT_PORT 9000
#define MAXLINE 1500
#define GROUP "239.0.0.2"

int main(void)
{
	int sockfd, i ;
	struct sockaddr_in serveraddr, clientaddr;
	char buf[MAXLINE] = "itcast\n";
	char ipstr[INET_ADDRSTRLEN]; /* 16 Bytes */
	socklen_t clientlen;
	ssize_t len;
	struct ip_mreqn group;

	/* 构造用于UDP通信的套接字 */
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);

	bzero(&serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = AF_INET; /* IPv4 */
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /* 本地任意IP INADDR_ANY = 0 */
	serveraddr.sin_port = htons(SERVER_PORT);

	bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

	/*设置组地址*/
	inet_pton(AF_INET, GROUP, &group.imr_multiaddr);
	/*本地任意IP*/
	inet_pton(AF_INET, "0.0.0.0", &group.imr_address);
	/* eth0 --> 编号 命令:ip ad */
	group.imr_ifindex = if_nametoindex("eth0");
	setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF, &group, sizeof(group));

	/*构造 client 地址 IP+端口 */
	bzero(&clientaddr, sizeof(clientaddr));
	clientaddr.sin_family = AF_INET; /* IPv4 */
	inet_pton(AF_INET, GROUP, &clientaddr.sin_addr.s_addr);
	clientaddr.sin_port = htons(CLIENT_PORT);

	while (1) {
		//fgets(buf, sizeof(buf), stdin);
		sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));
		sleep(1);
	}
	close(sockfd);
	return 0;
}

client

#include <netinet/in.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <net/if.h>

#define SERVER_PORT 6666
#define MAXLINE 4096
#define CLIENT_PORT 9000
#define GROUP "239.0.0.2"

int main(int argc, char *argv[])
{
	struct sockaddr_in serveraddr, localaddr;
	int confd;
	ssize_t len;
	char buf[MAXLINE];

	/* 定义组播结构体 */
	struct ip_mreqn group;
	confd = socket(AF_INET, SOCK_DGRAM, 0);

	//初始化本地端地址
	bzero(&localaddr, sizeof(localaddr));
	localaddr.sin_family = AF_INET;
	inet_pton(AF_INET, "0.0.0.0" , &localaddr.sin_addr.s_addr);
	localaddr.sin_port = htons(CLIENT_PORT);

	bind(confd, (struct sockaddr *)&localaddr, sizeof(localaddr));

	/*设置组地址*/
	inet_pton(AF_INET, GROUP, &group.imr_multiaddr);
	/*本地任意IP*/
	inet_pton(AF_INET, "0.0.0.0", &group.imr_address);
	/* eth0 --> 编号 命令:ip ad */
	group.imr_ifindex = if_nametoindex("eth0");
	/*设置client 加入多播组 */
	setsockopt(confd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group));

	while (1) {
		len = recvfrom(confd, buf, sizeof(buf), 0, NULL, 0);
		write(STDOUT_FILENO, buf, len);
	}
	close(confd);
	return 0;
}

计算机网络 | 广播与组播
计算机网络 | 广播与组播文章来源地址https://www.toymoban.com/news/detail-446660.html


到了这里,关于计算机网络 | 广播与组播的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机网络】13、ARP 包:广播自己的 mac 地址和 ip

    机器启动时,会向外广播自己的 mac 地址和 ip 地址,这个即称为 arp 协议。范围是未经过路由器的部分,如下图的蓝色部分,范围内的设备都会在本地记录 mac 和 ip 的绑定信息,若有重复则覆盖更新(例如先收到 mac1-ip1、再收到 mac2-ip1 时则覆盖记录为 mac2-ip): 案例:假设某

    2024年02月12日
    浏览(43)
  • 【计算机网络八股】计算机网络(一)

    计算机网络体系可以大致分为一下三种,OSI七层模型、TCP/IP四层模型和五层模型。 OSI七层模型:大而全,但是比较复杂、而且是先有了理论模型,没有实际应用。 TCP/IP四层模型:是由实际应用发展总结出来的,从实质上讲,TCP/IP只有最上面三层,最下面一层没有什么具体内

    2024年02月11日
    浏览(47)
  • 计算机网络----计算机网络的基础

    目录 一.计算机网络的相关概念 二.计算机网络的功能 三.计算机网络的发展 四.计算机网络的组成 五.计算机网络的分类 六.计算机的性能指标 1.速率 2.带宽 3.吞吐量 4.时延 5.时延带宽积 6.往返时延RTT 7.利用率 七.计算机的分层结构 八.ISO/OSI参考模型 九.OSI参考模型与TCP/IP参考模

    2024年03月17日
    浏览(47)
  • 计算机网络——计算机网络体系结构

    1.1 概念 一般认为,计算机网络是一个将分散的,具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享的信息传递的系统,简而言之,计算机网络就是一些 互联的,自治的计算机系统的集合 1.2 组成 (1)从组成部分:由 硬件,软件,

    2024年02月15日
    浏览(52)
  • 第一章 计算机网络概述【计算机网络】

    2023-3-26 17:07:26 以下内容源自《【计算机网络】》 仅供学习交流使用 计算机网络 计算机网络(第8版) 谢希仁 编著 1.2.1 网络的网络 计算机网络〈简称为网络)由若干结点(node) R和连接这些结点的链路(link)组成。 1.2.2互联网基础结构发展的三个阶段 请读者注意以下两个意思相

    2024年02月13日
    浏览(48)
  • 计算机网络-笔记-第一章-计算机网络概述

    一、第一章——计算机网络概述 二、第二章——物理层 三、第三章——数据链路层 四、第四章——网络层 五、第五章——运输层 六、第六章——应用层 目录 一、第一章——计算机网络概述 1、因特网概述 (1)网络、互联网、因特网 (2)因特网发展的三个阶段 (3)因特

    2024年02月11日
    浏览(51)
  • 【计算机网络原理】第一章:计算机网络概述

    1、计算机网络的诞生 从技术范畴来看,计算机网络是计算机技术与通信技术相互融合的产物。 2、计算机网络的定义 计算机网络是互连的、自治的计算机的集合 1)自治: 互连的计算机系统彼此独立,不存在主从或者控制与被控制的关系。 2)互连: 利用通信链路连接相互独立

    2024年04月08日
    浏览(51)
  • 【计算机网络】—— 详解码元,传输速率的计算|网络奇缘系列|计算机网络

    🌈个人主页:  Aileen_0v0 🔥系列专栏:  一见倾心,再见倾城  ---  计算机网络~ 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\" 目录 码元  速率和波特 思考1   思考2  思考3 带宽(Bandwidth)  📝总结 码元 是指用一个 固定时长的信号波形 _(数字脉冲),代表不同离散数值的基本波

    2024年02月04日
    浏览(61)
  • 【计算机网络】第一章、计算机网络体系结构

    1.计算机网络的组成 从不同的角度来看 内容 从组成上看 硬件、软件、协议 从工作方式上岸 边缘部分、核心部分 从功能上看 通信子网、资源子网 2.计算机网络的分类 角度 内容 分布范围 广域网、城域网、局域网、个域网 传输技术 广播式网络、点对点网络 拓扑结构 总线型

    2024年02月07日
    浏览(55)
  • 初识计算机网络 | 计算机网络的发展 | 协议初识

    1.计算机网络的发展 “矛盾是普遍存在的,矛盾是事物联系的实质内容和 事物发展的根本动力 !” 计算机在诞生之初,在军事上用来计算导弹的弹道轨迹!在发展的过程中( 商业的推动,国家政策推动 ),计算机的应用场景被发现!被应用于各种各样的场景当中! 现在,

    2024年01月25日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包