udp多播/组播那些事

2023-12-26 09:30
文章标签 udp 多播 组播

本文主要是介绍udp多播/组播那些事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

多播与组播

多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broadcast)是一对所有的通信方式,而多播(或组播)是一对多的通信方式。

多播/组播通信允许一个发送者将数据包同时传输给多个接收者,这些接收者形成一个接收组(receiving group)或多播组(multicast group)。发送者只需发送一次数据包,而不需要为每个接收者单独发送。

只存在于udp

UDP协议支持多播和广播,而TCP协议不直接支持广播和多播。

UDP协议是一种无连接的协议,它允许应用程序通过多播地址或广播地址发送数据包。多播地址是一个预定义的IP地址范围,用于标识多播组,而广播地址则是一个特殊的IP地址,用于向网络中的所有主机发送数据包。

在UDP中,你可以使用特定的套接字选项设置多播地址,并使用sendto()函数发送数据包到多播组。接收端可以通过加入相同的多播组地址,使用recvfrom()函数接收多播数据包。

相比之下,TCP协议是一种面向连接的协议,它提供可靠的、有序的数据传输。TCP协议不直接支持多播和广播功能,因为它是基于点对点通信模型的,只能通过建立一对一的连接进行数据传输。

多播接收端程序

以下是一个使用C语言编写的简单示例,用于接收和发送多播数据包:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>#define MULTICAST_GROUP "239.0.0.1" // 多播组地址
#define PORT 12345                 // 多播组的端口号
#define MAX_BUFFER_SIZE 1024       // 接收缓冲区大小int main() {int sockfd;struct sockaddr_in multicastAddr;struct sockaddr_in clientAddr;char buffer[MAX_BUFFER_SIZE];// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置套接字选项,允许接收多播数据int enable = 1;if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) < 0) {perror("setsockopt SO_REUSEADDR failed");exit(EXIT_FAILURE);}// 绑定到本地地址和端口memset(&clientAddr, 0, sizeof(clientAddr));clientAddr.sin_family = AF_INET;clientAddr.sin_addr.s_addr = INADDR_ANY;clientAddr.sin_port = htons(PORT);if (bind(sockfd, (struct sockaddr *)&clientAddr, sizeof(clientAddr)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 加入多播组struct ip_mreq multicastReq;multicastReq.imr_multiaddr.s_addr = inet_addr(MULTICAST_GROUP);multicastReq.imr_interface.s_addr = htonl(INADDR_ANY);if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&multicastReq, sizeof(multicastReq)) < 0) {perror("setsockopt IP_ADD_MEMBERSHIP failed");exit(EXIT_FAILURE);}printf("Waiting for multicast messages...\n");while (1) {// 接收多播数据包socklen_t addrLen = sizeof(multicastAddr);ssize_t recvLen = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&multicastAddr, &addrLen);if (recvLen < 0) {perror("recvfrom failed");exit(EXIT_FAILURE);}buffer[recvLen] = '\0';printf("Received multicast message: %s\n", buffer);}// 关闭套接字close(sockfd);return 0;
}

在该示例中,我们使用socket()函数创建了一个UDP套接字,并使用setsockopt()函数设置了SO_REUSEADDR选项,以便允许套接字重新使用本地地址。然后,我们使用bind()函数将套接字绑定到本地地址和端口。

接下来,我们使用IP_ADD_MEMBERSHIP选项加入多播组,指定了多播组地址和本地网络接口。这样,套接字就可以接收到发送到指定多播组的数据包。

最后,我们使用一个循环来持续接收多播数据包。使用recvfrom()函数从套接字接收数据包,并打印接收到的消息。

请注意,接收端和发送端应该使用相同的多播组地址和端口号以进行通信。

多播发送断程序

以下是一个使用C语言编写的简单多播发送示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>#define MULTICAST_GROUP "239.0.0.1" // 多播组地址
#define PORT 12345                 // 多播组的端口号int main() {int sockfd;struct sockaddr_in multicastAddr;char *message = "Hello, Multicast!";// 创建UDP套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置多播组地址和端口号memset(&multicastAddr, 0, sizeof(multicastAddr));multicastAddr.sin_family = AF_INET;multicastAddr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);multicastAddr.sin_port = htons(PORT);// 发送多播数据包if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&multicastAddr, sizeof(multicastAddr)) < 0) {perror("sendto failed");exit(EXIT_FAILURE);}printf("Multicast message sent.\n");// 关闭套接字close(sockfd);return 0;
}

在这个示例中,我们创建了一个UDP套接字,并设置了多播组的地址和端口号。然后,使用sendto()函数将消息发送到多播组的地址。最后,关闭套接字。

注意事项

对于发送多播数据包的示例,不需要显式地绑定本地端口。

在发送端,我们只需创建一个UDP套接字并将数据包发送到多播组的地址。操作系统会自动选择一个本地端口进行发送。

接收端需要绑定本地端口是因为它需要告诉操作系统将接收到的多播数据包发送到哪个端口。

当接收端加入一个多播组时,它需要指定一个本地端口来接收多播数据包。通过将套接字绑定到一个特定的本地端口,操作系统会将接收到的多播数据包传递给该端口上运行的应用程序。

绑定本地端口的步骤通常在接收端的代码中进行,以便接收来自多播组的数据包。在之前提供的多播接收示例中,我们在接收端的代码中使用bind()函数将套接字绑定到本地地址和端口。

简而言之,接收端绑定本地端口是为了告诉操作系统将接收到的多播数据包传递给相应的应用程序,而发送端无需显式地绑定本地端口,操作系统会自动选择一个可用的本地端口进行发送。

在这里插入图片描述

这篇关于udp多播/组播那些事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/538897

相关文章

VC环境下window网络程序:UDP Socket程序

最近在学Windows网络编程,正好在做UDPsocket的程序,贴上来: 服务器框架函数:              socket();    bind();    recfrom();  sendto();  closesocket(); 客户机框架函数:            socket();      recfrom();  sendto();  closesocket();

9.7(UDP局域网多客户端聊天室)

服务器端 #include<myhead.h>#define SERIP "192.168.0.132"#define SERPORT 8888#define MAX 50//定义用户结构体typedef struct{struct sockaddr_in addr;int flag;}User;User users[MAX];//用户列表void add_user(struct s

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的通信中,多播可大大节约网络资源。假设视频服务器向 90 台主机传送同样的视频节目,单播与多播的比较如下图所示。 下图(a)是视频服务器用单播方式向 90 台主机传

应用层简单实现udp / tcp网络通信

一、常见网络接口总结 1、创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器) int socket(int domain, int type, int protocol); domain:AF_INET:网络通信,AF_LOCAL:本地通信 type:UDP:SOCK_DGRAM,TCP:SOCK_STREAM protocol:协议编号一开始设0 返回值:文件描

[网络编程]TCP和UDP的比较 及 通过java用UDP实现网络编程

文章目录 一. 网络编程套接字TCP和UDP的特点有连接 vs 无连接可靠传输 vs 不可靠传输面向字节流 vs 面向数据报全双工 vs 半双工 二. java用UDP实现网络编程代码实现:运行代码:启动多个客户端别人能否使用?实现翻译功能 一. 网络编程套接字 网络编程套接字, 就是指操作系统提供的网络编程的api, 称为"socket api" 操作系统, 提供的sock

Java高级Day37-UDP网络编程

109.netstat指令 netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况 netstat -an|more 可以分页显示 要求在dos控制台下执行 说明: LISTENING表示某个端口在监听 如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息 ctrl + c 退出指令 110.TCP连接秘密 1.当客户端连接到服务器后,

传输层协议UDP

本篇将主要介绍 UDP 协议,介绍了有关 UDP 协议的报头、协议特点、UDP 协议在操作系统中的缓冲区、UDP 协议使用的注意事项,以及有关 UDP 的 Socket 编程程序,同时重点介绍了操作系统对于 UDP 协议报文的管理。         接着介绍了有关端口号的映射。 目录 UDP协议 1. UDP协议报头 2. UDP协议特点 3. UDP的缓冲区 4.

UDP通信实现

目录 前言 一、基础知识 1、跨主机传输         1、字节序          2、主机字节序和网络字节序          3、IP转换 2、套接字 3、什么是UDP通信  二、如何实现UDP通信          1、socket():创建套接字         2、bind():绑定套接字           3、sendto():发送指定套接字文件数据

MarkTool之网络篇UDP

UDP客户端         1、连接服务端         2、校验方式         3、接收数据类型         4、发送数据类型         5、暂停显示         6、将数据区域保存到文件         7、定时发送         8、快捷指令         9、批量发送         10、历史发送

udp网络通信 socket

套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性,端口可以标定进程在主机的唯一性,那么socket通过IP+端口号就可以让两个在全网唯一标定的进程进行通信。 套接字有三种: 域间套接字:实现主机内部的进程通信的编程 原始套接字:使用网络层或者数据链路层的接口进行编程,更难更底层,例如制作抓包等网络工具 网络套接字:实现用户通信的编程 udp网络通信 服务端server 分