【TCP/IP】多播 - 定义、原理及编程实现 (TTL、多播组、多播消息)

article/2025/9/9 21:48:10

目录

多播

多播的原理

多播的数据传输时的特点

TTL 的概念

TTL 和 多播组的配置方法

多播的编程与实现

发送者

接收者


多播

        多播是一种介于单播和广播通信之间的技术方式,可以将发送者所需要发送的数据包分别发送给分散在不同子网中的一组接收者。

多播的原理

        多播的基础概念是“组”。一个多播组(multicast group)就是一组希望接收特定数据流的接收者,这个组没有物理或者地理的边界:组内的主机可位于互联网或者专用网络的任何地方。

        多播组中的每个节点被称为多播组成员(multicastgroupmember)。多播的数据传输协议基于UDP完成。采用多播方式时,可以同时向多个主机传递数据。

多播的数据传输时的特点

  • 多播服务器端针对特定多播组,只发送 1 次数据。
  • 即使只发送 1 次数据,但该组内的所有客户端都会接收数据。
  • 多播组数可在IP地址范围内任意增加。
  • 加入特定组即可接收发往该多播组的数据。 

        多播组的地址属于D类,即 224.0.0.0 ~ 239.255.255.255在发送多播数据包时(路由器得支持这项功能),需要有机器加入到多播组中以接收发来的数据包,同时路由器担负起将该数据包复制并传递到多个主机中的任务。如下图所示:

TTL 的概念

        传输多播数据包时,需要给程序设置TTL(TIme to Live 生存时间),这是决定数据包能否及时准确到达目标点的关键参数。

        TTL用整数表示,每经过1个路由器该数值便会减1。当TTL变为0时,该数据包将无法再被传递,作销毁处理。因此,在TTL的值上需要合理设置,过大会影响网络流量,过小将无法将数据包及时传递到目标。

TTL 和 多播组的配置方法

        在编程中,我们可以实现对 TTL 的设置。TTL相关的协议层为IPPROTO_IP,选项名为IP_MULTICAST_TTL,通过使用setsocketopt这个函数进行设置。

        代码如下:

int sock;
int ttl = 64;sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&ttl, sizeof(ttl));

        同样,加入到多播组也是通过 setsocketopt 函数完成。多播组加入的协议层为IPPROTO_IP,选项名为IP_ADD_MEMBERSHIP。 

        代码如下:

int recv_sock;
struct ip_mreq groupjoin_adr;recv_sock = socket(PF_INET, SOCK_DGRAM, 0);join_adr.imr_multiaddr.s_addr = "多播组的地址";
join_adr.imr_interace.s_addr = "加入多播组的主机地址";
setsockopt(recv_sock , IPPROTO_IP , IP_ADD_MEMBERSHIP , (void*) & groupjoin_adr), sizeof(groupjoin_adr));

        其中 ip_mreq 结构体,定义如下:

struct ip_mreq{/* 欲加入的多播组的地址.  */struct in_addr imr_multiaddr;/* 所属主机的IP地址. 可以使用INADDR_ANY  */struct in_addr imr_interface;};

多播的编程与实现

        多播中区分 发送者(Sender)接收者(Receiver)。发送者指的是发送多播数据的主体,接收者指的是位于多播组中的欲接收多播数据的主体。

发送者

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define TTL 64
#define BUF_SIZE 1024void Sender_message(char *message)
{puts(message);exit(1);
}int main(int argc, char *argv[])
{int send_sock;struct sockaddr_in mul_addr;int time2live = TTL;FILE *fp;char buf[BUF_SIZE];send_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&mul_addr, 0, sizeof(mul_addr));mul_addr.sin_family = AF_INET;mul_addr.sin_addr.s_addr = inet_addr(argv[1]); // 多播地址mul_addr.sin_port = htons(atoi(argv[2]));	   // 多播端口号setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&time2live, sizeof(time2live));fp = fopen(argv[3], "r");if (fp == NULL){Sender_message((char*)"file open error");}while (!feof(fp)) /* 发送数据 */{fgets(buf, BUF_SIZE, fp);sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr *)&mul_addr, sizeof(mul_addr));}fclose(fp);close(send_sock);return 0;
}

接收者

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 1024//报错消息发送
void Sender_message(char *message)
{puts(message);exit(1);
}int main(int argc, char *argv[])
{int recv_sock;int str_len;char buf[BUF_SIZE];struct sockaddr_in addr;struct ip_mreq join_addr;recv_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = htonl(INADDR_ANY);addr.sin_port = htons(atoi(argv[2]));if (bind(recv_sock, (struct sockaddr *)&addr, sizeof(addr)) == -1){Sender_message((char*)"bind error");}join_addr.imr_multiaddr.s_addr = inet_addr(argv[1]);join_addr.imr_interface.s_addr = htonl(INADDR_ANY);setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&join_addr, sizeof(join_addr));while (1){// 接收多播数据 其中第五、第六个参数在不知道主机地址时可设为NULL和0str_len = recvfrom(recv_sock, buf, BUF_SIZE - 1, 0, NULL, 0);if (str_len < 0){break;}buf[str_len] = 0;fputs(buf, stdout);}close(recv_sock);return 0;
}

运行结果


http://chatgpt.dhexx.cn/article/E8j5Dxb4.shtml

相关文章

socket之UDP组播(多播)

1. 概述 1.1 单播用于两个主机间单对单的通信 1.2广播用于一个主机对整个局域网上所有主机上的数据通信 1.3单播和广播是两个极端&#xff0c;要么对一个主机进行通信&#xff0c;要么对整个局域网的主机进行通信 1.4实际情况下&#xff0c;经常需要对一组特定的主机进行通信&a…

IP多播技术详解

文章目录 前言IP多播技术的相关基本概念IP多播地址和多播组 在局域网上进行硬件多播IP多播地址和多播MAC地址映射关系 在因特网上进行IP多播网际组管理协议IGMP多播路由选择协议 前言 随着计算机网络的发展和个人计算机的普及&#xff0c;人们能够方便的在网络上畅游&#xff…

UDP多播

一、多播概念 1.1、多播 多播又称为&#xff1a;组播。 一个人发数据&#xff0c;只有加入到多播组的人接收数据 1.2、多播的特点 1、多播地址标示一组接口 2、多播可以用于广域网使用 3、在IPv4中&#xff0c;多播是可选的 1.3、多播地址 IPv4的D类地址是多播地址…

多播(组播)

什么是多播 单播用于两个主机之间的端对端通信&#xff0c;广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端&#xff0c;要么对一个主机进行通信&#xff0c;要么对整个局域网上的主机进行通信。实际情况下&#xff0c;经常需要对一组特定的主机…

多播与广播

多播 多播(Multicast)方式的数据传输是基于UDP完成的。因此&#xff0c;与UDP服务器端/客户端的实现方式非常接近。区别在于&#xff0c;UDP数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入(注册)特定组的大量主机。换言之&#xff0c;采用多播方式时&#xff0c…

多播(IP多播-网络层)与单播

多播&#xff08;IP多播-网络层&#xff09;与单播 多播&#xff08;IP多播-网络层&#xff09;简介多播组地址&#xff08;IP地址中的D类地址&#xff09;【多播组地址——D类地址】中一些不能随意使用的地址 IP多播的分类 在局域网上进行的硬件多播网际组管理协议IGMP和多播路…

多播的概念

一、多播概述 多播&#xff1a;数据的收发仅仅在同一组中进行 &#xff08;相当于我往一个群里发&#xff0c;只有加入这个群的人才能收到&#xff09; 多播的特点&#xff1a; ①多播地址标示一组接口。 ②多播可以用于广域网使用。 ③在IPv4&#xff0c;多播是可选的。 二…

win10——telnet 开启

1.win10默认没有开启 2.找到控制面板 3.找到Telnet客户端 4.测试 5.退出 ctrl ‘]’ 之后q

windows service2008 2R 开启telnet

1&#xff0c;什么是telnet 可以把telnet当作一种通信协议&#xff0c;对于入侵者而言telnet是一种远程登录的工具。 2&#xff0c;windows开启telnet&#xff08;默认情况下windows系统的telnet功能是关闭的&#xff09; 步骤&#xff1a; ①打开控制面板 输入winR 输入contro…

windows telnet开启

windows下telnet 服务开启 工作中经常要判断服务器某个端口是否连通&#xff0c;如需要看下测试服务器中tomcat的8080端口是否连通&#xff0c;需用到命令 &#xff1a; telnet 192.168.1.101 8080 ,如图&#xff1a; 解决方案 1、telnet在win7下默认是不开启的&#xff0c;所…

服务器系统开启telnet,Telnet怎么打开 Win7/Win8系统开启Telnet服务方法图解

Telnet是管理员常用的远程登录和管理工具&#xff0c;通过在本地电脑上运行Telnet客户端服务&#xff0c;就可以远程控制远端的Telnet服务器了。在Windows 2003/XP/Vista/Win7/Win8系统中都集成有Telnet服务。过默认情况下Telnet服务是被禁用的&#xff0c;需要使用的朋友&…

linux 打开telnet登录,linux开启telnet

Centos6启telnet 安装 [rootntp1 ~]# yum install telnet telnet-server xinetd 开启xinetd自启动和启动xinetd [rootntp1 ~]# chkconfig xinetd on [rootntp1 ~]# service xinetd restart 允许root用户登录 [rootntp1 ~]# vi /etc/pam.d/remote 修改/etc/pam.d/remote&#xf…

如何保存网页上的图片原图,大图

如何保存网页上的图片原图&#xff0c;大图 步骤1&#xff1a; 使用google浏览器&#xff0c;打开网页&#xff0c;按F12&#xff08;或者打开 ‘开发者工具’&#xff09;&#xff0c;点击source&#xff0c;并选择img过滤。可以看到下面的图片链接&#xff0c;如图&#xf…

网页保存成图片

Chrome中网页保存成图片 1、F12 2、Ctrl Shift P 3、输入full firefox网页保存成图片 1、看下附加组件中是否有网页截图&#xff0c;如有&#xff0c;则直接使用即可&#xff0c;无&#xff0c;打开(或下载)就行 2、截图 &#xff08;个人觉得firefox的截图比较灵活&#x…

图片的加载、显示和保存

目录 1.预备知识 2.代码实现 1.预备知识 imread() 加载图片imwrite() 保存图像 imread() 加载图片 有两个参数&#xff0c;第一个参数为字符串形式&#xff0c;也就是图片的路径 第二个参数是一个flag&#xff0c;指定了读取图像的方式&#xff0c; 默认的是加…

图片上传-->保存图片

显示图片的img标签 获取文件读取器 var imageReadernew FileReader(); 使用正则表达式给图片过滤 regexImageFilter /^(?:image/bmp|image/gif|image/jpg|image/jpeg|image/png)$/i; 文件读取器加载时间&#xff0c;在读取文件完成后触发 imageReader.οnlοadfunction(ev…

Python爬虫 自动爬取图片并保存

一、准备工作 用python来实现对图片网站的爬取并保存&#xff0c;以情绪图片为例&#xff0c;搜索可得到下图所示 f12打开源码 在此处可以看到这次我们要爬取的图片的基本信息是在img - scr中 二、代码实现 这次的爬取主要用了如下的第三方库 import re import time import …

保存网页图片的方法

最近ui妹子经常找我....... 当然不是的....只是想让我给他弄两张网页的图片....遂FE退化切图仔.... 话不多说&#xff0c;进入正文。有些朋友因为工作需要&#xff08;比如某鹿某祖等图片好想保存下来天天舔屏&#xff0c;还得是高清的....&#xff09;又不知道如何保存网页中…

图片管理之保存图片数据

保存图片数据 在保存数据之前我们需要先获取图片关联的sku的id 1、获取sku表id 接口分析 请求方式&#xff1a; GET /meiduo_admin/skus/simple/ # -------获取sku的id--------url(rskus/simple/$, images.ImageView.as_view({get: simple})), 请求参数&#xff1a; 通过请…

图片的上传与保存

先找到数据库的用户表点击设计添加 picture 字段与 nvarchar 数据类型 2.更新数据模型&#xff0c;先找到 S_User 表删除&#xff0c;然后再从数据库更新模型并保存 3.先在视图上写出图片上传与保存需要的页面 3.1 { title: ‘头像’, templet: customUserPicture },//头像…