当前位置: 首页 > news >正文

同一网站相同form id外行学习个人网站建设

同一网站相同form id,外行学习个人网站建设,用手机做网站的流程,怎么用 c文件做网站一、引言 在计算机网络通信领域#xff0c;UDP#xff08;User Datagram Protocol#xff0c;用户数据报协议#xff09;是一种重要的传输层协议。它以无连接、低开销的特点#xff0c;在众多实时性要求高的应用场景中发挥关键作用。UDP 支持单播、多播和广播三种通信模式…一、引言 在计算机网络通信领域UDPUser Datagram Protocol用户数据报协议是一种重要的传输层协议。它以无连接、低开销的特点在众多实时性要求高的应用场景中发挥关键作用。UDP 支持单播、多播和广播三种通信模式每种模式都有其独特的应用场景和工作原理。深入理解这些通信模式对于开发高效的网络应用程序至关重要。 二、UDP 基础概述 UDP 是一种无连接的传输层协议它在网络层 IP 协议的基础上为应用层提供了简单的数据传输服务。与面向连接的 TCPTransmission Control Protocol协议不同UDP 不保证数据的可靠传输、顺序交付以及数据的完整性。然而UDP 的这些特性使得它在一些对实时性要求较高对数据准确性要求相对较低的场景中具有显著优势如实时音频和视频流、在线游戏、网络管理等。 UDP 数据报由首部和数据两部分组成。首部长度固定为 8 字节包含四个字段 源端口号16 位标识发送端应用程序的端口用于接收端回发数据。目的端口号16 位标识接收端应用程序的端口用于确定数据的接收方。长度16 位UDP 数据报的总长度包括首部和数据部分最小值为 8 字节仅首部。校验和16 位用于检测数据报在传输过程中是否发生错误但校验和是可选的若不使用则该字段设为全零。 三、UDP 单播 3.1 概念描述 UDP 单播是一种一对一的通信方式发送端向特定的一个接收端发送数据。在这种通信模式下发送端在 UDP 数据报的首部中明确指定接收端的 IP 地址和端口号。网络设备根据数据报中的目的 IP 地址通过路由算法将数据报转发到目标接收端。单播通信的特点是数据传输的针对性强只有目标接收端能够接收到数据适用于大多数需要精确通信的场景如客户端 - 服务器模型的应用程序。 3.2 示例代码实现 3.2.1 发送端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define SERVER_IP 127.0.0.1 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(buffer, 0, sizeof(buffer));// 设置服务器地址servaddr.sin_family AF_INET;servaddr.sin_port htons(PORT);servaddr.sin_addr.s_addr inet_addr(SERVER_IP);char *msg Hello, Server!;sendto(sockfd, (const char *)msg, strlen(msg), MSG_CONFIRM, (const struct sockaddr *)servaddr, sizeof(servaddr));printf(Message sent to server: %s\n, msg);close(sockfd);return 0; }3.2.2 接收端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr, cliaddr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(cliaddr, 0, sizeof(cliaddr));// 设置服务器地址servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr INADDR_ANY;servaddr.sin_port htons(PORT);// 绑定套接字到地址if (bind(sockfd, (const struct sockaddr *)servaddr, sizeof(servaddr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);}socklen_t len sizeof(cliaddr);int n recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)cliaddr, len);buffer[n] \0;printf(Message received from client: %s\n, buffer);close(sockfd);return 0; }3.3 编译和测试过程 编译 在终端中切换到包含 udp_unicast_sender.c 和 udp_unicast_receiver.c 文件的目录。编译发送端代码gcc -o udp_unicast_sender udp_unicast_sender.c编译接收端代码gcc -o udp_unicast_receiver udp_unicast_receiver.c 测试 首先在一个终端中运行接收端程序./udp_unicast_receiver然后在另一个终端中运行发送端程序./udp_unicast_sender接收端将显示接收到的消息Message received from client: Hello, Server! 四、UDP 广播 4.1 概念描述 UDP 广播是一种一对所有的通信方式发送端向网络中的所有设备发送数据。广播地址分为两种类型有限广播和直接广播。 有限广播使用地址 255.255.255.255它是一种受限的广播地址仅在本地网络内进行广播路由器不会转发以有限广播地址为目的地址的数据包。直接广播网络地址的主机位全为 1 的地址。例如对于网络 192.168.1.0/24其直接广播地址为 192.168.1.255。直接广播数据包可以被路由器转发到指定网络的所有主机。 4.2 原理 4.2.1 有限广播原理 发送端 发送端创建 UDP 套接字并设置套接字选项以允许广播setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, broadcastEnable, sizeof(broadcastEnable))其中 broadcastEnable 为一个非零值通常设为 1。构造 UDP 数据报将目的 IP 地址设置为 255.255.255.255目的端口号设置为接收端监听的端口号。使用 sendto 函数发送数据报数据报将在本地网络内广播所有监听该端口的设备都能接收。 接收端 接收端创建 UDP 套接字并绑定到指定的端口号。使用 recvfrom 函数接收数据报当有广播数据到达时接收端就能接收到。 4.2.2 直接广播原理 发送端 同样发送端先创建 UDP 套接字并设置允许广播选项。构造 UDP 数据报时将目的 IP 地址设置为目标网络的直接广播地址目的端口号设置为接收端监听的端口号。使用 sendto 函数发送数据报路由器会将该数据报转发到目标网络的所有主机。 接收端 接收端在目标网络内创建 UDP 套接字并绑定到指定端口号。使用 recvfrom 函数接收数据报接收来自发送端的广播数据。 4.3 流程示意图 4.3.1 有限广播流程示意图 #mermaid-svg-IuPScEoZjadT3xhS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IuPScEoZjadT3xhS .error-icon{fill:#552222;}#mermaid-svg-IuPScEoZjadT3xhS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IuPScEoZjadT3xhS .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-IuPScEoZjadT3xhS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IuPScEoZjadT3xhS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IuPScEoZjadT3xhS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IuPScEoZjadT3xhS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IuPScEoZjadT3xhS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IuPScEoZjadT3xhS .marker.cross{stroke:#333333;}#mermaid-svg-IuPScEoZjadT3xhS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IuPScEoZjadT3xhS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IuPScEoZjadT3xhS .cluster-label text{fill:#333;}#mermaid-svg-IuPScEoZjadT3xhS .cluster-label span{color:#333;}#mermaid-svg-IuPScEoZjadT3xhS .label text,#mermaid-svg-IuPScEoZjadT3xhS span{fill:#333;color:#333;}#mermaid-svg-IuPScEoZjadT3xhS .node rect,#mermaid-svg-IuPScEoZjadT3xhS .node circle,#mermaid-svg-IuPScEoZjadT3xhS .node ellipse,#mermaid-svg-IuPScEoZjadT3xhS .node polygon,#mermaid-svg-IuPScEoZjadT3xhS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IuPScEoZjadT3xhS .node .label{text-align:center;}#mermaid-svg-IuPScEoZjadT3xhS .node.clickable{cursor:pointer;}#mermaid-svg-IuPScEoZjadT3xhS .arrowheadPath{fill:#333333;}#mermaid-svg-IuPScEoZjadT3xhS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IuPScEoZjadT3xhS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IuPScEoZjadT3xhS .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-IuPScEoZjadT3xhS .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-IuPScEoZjadT3xhS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IuPScEoZjadT3xhS .cluster text{fill:#333;}#mermaid-svg-IuPScEoZjadT3xhS .cluster span{color:#333;}#mermaid-svg-IuPScEoZjadT3xhS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IuPScEoZjadT3xhS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 设置套接字为广播模式 发送有限广播数据报 广播数据 广播数据 广播数据 发送端 构造有限广播数据报 目的地址255.255.255.255 本地网络 接收端1 接收端2 接收端3 4.3.2 直接广播流程示意图 #mermaid-svg-dz4oZG6j8HNPrNIb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dz4oZG6j8HNPrNIb .error-icon{fill:#552222;}#mermaid-svg-dz4oZG6j8HNPrNIb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dz4oZG6j8HNPrNIb .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-dz4oZG6j8HNPrNIb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dz4oZG6j8HNPrNIb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dz4oZG6j8HNPrNIb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dz4oZG6j8HNPrNIb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dz4oZG6j8HNPrNIb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dz4oZG6j8HNPrNIb .marker.cross{stroke:#333333;}#mermaid-svg-dz4oZG6j8HNPrNIb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dz4oZG6j8HNPrNIb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dz4oZG6j8HNPrNIb .cluster-label text{fill:#333;}#mermaid-svg-dz4oZG6j8HNPrNIb .cluster-label span{color:#333;}#mermaid-svg-dz4oZG6j8HNPrNIb .label text,#mermaid-svg-dz4oZG6j8HNPrNIb span{fill:#333;color:#333;}#mermaid-svg-dz4oZG6j8HNPrNIb .node rect,#mermaid-svg-dz4oZG6j8HNPrNIb .node circle,#mermaid-svg-dz4oZG6j8HNPrNIb .node ellipse,#mermaid-svg-dz4oZG6j8HNPrNIb .node polygon,#mermaid-svg-dz4oZG6j8HNPrNIb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dz4oZG6j8HNPrNIb .node .label{text-align:center;}#mermaid-svg-dz4oZG6j8HNPrNIb .node.clickable{cursor:pointer;}#mermaid-svg-dz4oZG6j8HNPrNIb .arrowheadPath{fill:#333333;}#mermaid-svg-dz4oZG6j8HNPrNIb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dz4oZG6j8HNPrNIb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dz4oZG6j8HNPrNIb .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-dz4oZG6j8HNPrNIb .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-dz4oZG6j8HNPrNIb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dz4oZG6j8HNPrNIb .cluster text{fill:#333;}#mermaid-svg-dz4oZG6j8HNPrNIb .cluster span{color:#333;}#mermaid-svg-dz4oZG6j8HNPrNIb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dz4oZG6j8HNPrNIb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 设置套接字为广播模式 发送直接广播数据报 路由器转发数据报 广播数据 广播数据 广播数据 发送端 构造直接广播数据报 目的地址 目标网络广播地址 网络 含路由器 目标网络 接收端1 接收端2 接收端3 4.4 示例代码实现 4.4.1 有限广播发送端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define LIMITED_BROADCAST_IP 255.255.255.255 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}int broadcastEnable 1;// 设置套接字选项以允许广播if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, broadcastEnable, sizeof(broadcastEnable)) 0) {perror(setsockopt failed);close(sockfd);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(buffer, 0, sizeof(buffer));// 设置有限广播地址servaddr.sin_family AF_INET;servaddr.sin_port htons(PORT);servaddr.sin_addr.s_addr inet_addr(LIMITED_BROADCAST_IP);char *msg Hello, Local Network!;sendto(sockfd, (const char *)msg, strlen(msg), MSG_CONFIRM, (const struct sockaddr *)servaddr, sizeof(servaddr));printf(Limited broadcast message sent: %s\n, msg);close(sockfd);return 0; }4.4.2 有限广播接收端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr, cliaddr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(cliaddr, 0, sizeof(cliaddr));// 设置服务器地址servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr INADDR_ANY;servaddr.sin_port htons(PORT);// 绑定套接字到地址if (bind(sockfd, (const struct sockaddr *)servaddr, sizeof(servaddr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);}socklen_t len sizeof(cliaddr);int n recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)cliaddr, len);buffer[n] \0;printf(Limited broadcast message received: %s\n, buffer);close(sockfd);return 0; }4.4.3 直接广播发送端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define DIRECT_BROADCAST_IP 192.168.1.255 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}int broadcastEnable 1;// 设置套接字选项以允许广播if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, broadcastEnable, sizeof(broadcastEnable)) 0) {perror(setsockopt failed);close(sockfd);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(buffer, 0, sizeof(buffer));// 设置直接广播地址servaddr.sin_family AF_INET;servaddr.sin_port htons(PORT);servaddr.sin_addr.s_addr inet_addr(DIRECT_BROADCAST_IP);char *msg Hello, 192.168.1.0 Network!;sendto(sockfd, (const char *)msg, strlen(msg), MSG_CONFIRM, (const struct sockaddr *)servaddr, sizeof(servaddr));printf(Direct broadcast message sent: %s\n, msg);close(sockfd);return 0; }4.4.4 直接广播接收端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr, cliaddr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(cliaddr, 0, sizeof(cliaddr));// 设置服务器地址servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr INADDR_ANY;servaddr.sin_port htons(PORT);// 绑定套接字到地址if (bind(sockfd, (const struct sockaddr *)servaddr, sizeof(servaddr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);}socklen_t len sizeof(cliaddr);int n recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)cliaddr, len);buffer[n] \0;printf(Direct broadcast message received: %s\n, buffer);close(sockfd);return 0; }4.5 编译和测试过程 编译 有限广播 在终端中切换到包含 udp_limited_broadcast_sender.c 和 udp_limited_broadcast_receiver.c 文件的目录。编译发送端代码gcc -o udp_limited_broadcast_sender udp_limited_broadcast_sender.c编译接收端代码gcc -o udp_limited_broadcast_receiver udp_limited_broadcast_receiver.c 直接广播 切换到包含 udp_direct_broadcast_sender.c 和 udp_direct_broadcast_receiver.c 文件的目录。编译发送端代码gcc -o udp_direct_broadcast_sender udp_direct_broadcast_sender.c编译接收端代码gcc -o udp_direct_broadcast_receiver udp_direct_broadcast_receiver.c 测试 有限广播 首先在本地网络内的多个终端中运行接收端程序./udp_limited_broadcast_receiver然后在另一个终端中运行发送端程序./udp_limited_broadcast_sender每个接收端都将显示接收到的有限广播消息Limited broadcast message received: Hello, Local Network! 直接广播 在目标网络192.168.1.0/24 为例内的多个终端中运行接收端程序./udp_direct_broadcast_receiver在可以向该目标网络发送直接广播的设备上运行发送端程序./udp_direct_broadcast_sender目标网络内的每个接收端都将显示接收到的直接广播消息Direct broadcast message received: Hello, 192.168.1.0 Network! 五、UDP 多播 5.1 概念描述 UDP 多播也称为组播是一种一对多的通信方式发送端向一组特定的接收端发送数据。这组接收端通过加入同一个多播组来接收数据。多播使用 D 类 IP 地址范围是 224.0.0.0 到 239.255.255.255来标识多播组。发送端将数据发送到多播组的 IP 地址网络会将数据转发给组内的所有成员。多播适用于一些需要向特定的一组设备发送相同数据的场景如在线视频会议、流媒体分发等。与广播不同多播不会向网络中的所有设备发送数据只有加入了相应多播组的设备才会接收数据这样可以减少网络流量提高传输效率。 5.2 原理 发送端 发送端创建 UDP 套接字。构造 UDP 数据报时将目的 IP 地址设置为多播组的 IP 地址目的端口号设置为接收端监听的端口号。使用 sendto 函数将数据报发送出去网络会根据多播路由协议将数据转发到多播组的成员。发送端不需要关心组内成员的具体 IP 地址只需要知道多播组的地址。 接收端 接收端创建 UDP 套接字并绑定到指定的端口号。为了加入多播组接收端需要使用 setsockopt 函数设置套接字选项。具体来说需要设置 IP_ADD_MEMBERSHIP 选项代码如下 struct ip_mreq mreq; mreq.imr_multiaddr.s_addr inet_addr(MULTICAST_IP); mreq.imr_interface.s_addr INADDR_ANY; if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq, sizeof(mreq)) 0) {perror(setsockopt failed);close(sockfd);exit(EXIT_FAILURE); }这里mreq 结构体包含多播组的 IP 地址和本地接口地址。通过设置 IP_ADD_MEMBERSHIP 选项接收端通知操作系统将该套接字加入指定的多播组。之后接收端使用 recvfrom 函数接收数据报就能接收到发往该多播组的所有数据。 5.3 流程示意图 #mermaid-svg-GkHilnlMW7XYY4j5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GkHilnlMW7XYY4j5 .error-icon{fill:#552222;}#mermaid-svg-GkHilnlMW7XYY4j5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GkHilnlMW7XYY4j5 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GkHilnlMW7XYY4j5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GkHilnlMW7XYY4j5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GkHilnlMW7XYY4j5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GkHilnlMW7XYY4j5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GkHilnlMW7XYY4j5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GkHilnlMW7XYY4j5 .marker.cross{stroke:#333333;}#mermaid-svg-GkHilnlMW7XYY4j5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GkHilnlMW7XYY4j5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GkHilnlMW7XYY4j5 .cluster-label text{fill:#333;}#mermaid-svg-GkHilnlMW7XYY4j5 .cluster-label span{color:#333;}#mermaid-svg-GkHilnlMW7XYY4j5 .label text,#mermaid-svg-GkHilnlMW7XYY4j5 span{fill:#333;color:#333;}#mermaid-svg-GkHilnlMW7XYY4j5 .node rect,#mermaid-svg-GkHilnlMW7XYY4j5 .node circle,#mermaid-svg-GkHilnlMW7XYY4j5 .node ellipse,#mermaid-svg-GkHilnlMW7XYY4j5 .node polygon,#mermaid-svg-GkHilnlMW7XYY4j5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GkHilnlMW7XYY4j5 .node .label{text-align:center;}#mermaid-svg-GkHilnlMW7XYY4j5 .node.clickable{cursor:pointer;}#mermaid-svg-GkHilnlMW7XYY4j5 .arrowheadPath{fill:#333333;}#mermaid-svg-GkHilnlMW7XYY4j5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GkHilnlMW7XYY4j5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GkHilnlMW7XYY4j5 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-GkHilnlMW7XYY4j5 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-GkHilnlMW7XYY4j5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GkHilnlMW7XYY4j5 .cluster text{fill:#333;}#mermaid-svg-GkHilnlMW7XYY4j5 .cluster span{color:#333;}#mermaid-svg-GkHilnlMW7XYY4j5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GkHilnlMW7XYY4j5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 构造多播数据报 多播数据 转发多播数据 转发多播数据 多播数据 发送端 发送多播数据 网络 接收端1 已加入组 接收端2 已加入组 未加入组的设备 忽略 5.4 示例代码实现 5.4.1 多播发送端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define MULTICAST_IP 224.1.1.1 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(buffer, 0, sizeof(buffer));// 设置多播地址servaddr.sin_family AF_INET;servaddr.sin_port htons(PORT);servaddr.sin_addr.s_addr inet_addr(MULTICAST_IP);char *msg Hello, Multicast Group!;sendto(sockfd, (const char *)msg, strlen(msg), MSG_CONFIRM, (const struct sockaddr *)servaddr, sizeof(servaddr));printf(Multicast message sent: %s\n, msg);close(sockfd);return 0; }5.4.2 多播接收端代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #include sys/socket.h#define PORT 8080 #define MULTICAST_IP 224.1.1.1 #define BUFFER_SIZE 1024int main(int argc, char const *argv[]) {int sockfd;struct sockaddr_in servaddr, cliaddr;struct ip_mreq mreq;char buffer[BUFFER_SIZE];// 创建 UDP 套接字if ((sockfd socket(AF_INET, SOCK_DGRAM, 0)) 0) {perror(socket creation failed);exit(EXIT_FAILURE);}memset(servaddr, 0, sizeof(servaddr));memset(cliaddr, 0, sizeof(cliaddr));// 设置服务器地址servaddr.sin_family AF_INET;servaddr.sin_addr.s_addr INADDR_ANY;servaddr.sin_port htons(PORT);// 绑定套接字到地址if (bind(sockfd, (const struct sockaddr *)servaddr, sizeof(servaddr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);}// 设置多播组地址和本地接口地址mreq.imr_multiaddr.s_addr inet_addr(MULTICAST_IP);mreq.imr_interface.s_addr INADDR_ANY;// 加入多播组if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq, sizeof(mreq)) 0) {perror(setsockopt failed);close(sockfd);exit(EXIT_FAILURE);}socklen_t len sizeof(cliaddr);int n recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)cliaddr, len);buffer[n] \0;printf(Multicast message received: %s\n, buffer);close(sockfd);return 0; }5.5 编译和测试过程 编译 在终端中切换到包含 udp_multicast_sender.c 和 udp_multicast_receiver.c 文件的目录。编译发送端代码gcc -o udp_multicast_sender udp_multicast_sender.c编译接收端代码gcc -o udp_multicast_receiver udp_multicast_receiver.c 测试 首先在多个终端中运行接收端程序模拟多播组成员./udp_multicast_receiver然后在另一个终端中运行发送端程序./udp_multicast_sender每个接收端都将显示接收到的多播消息Multicast message received: Hello, Multicast Group!
http://www.dnsts.com.cn/news/266016.html

相关文章:

  • 乐东黎族自治县住房建设局网站江苏省网站建设
  • 微信手机网站搭建大连最繁华的区是哪个区
  • 厦门网站开发排名网站如何实现微
  • seo免费网站建设wordpress 视频站模板下载失败
  • 一般网站建设步骤做ppt的图片素材网站有哪些
  • 怎么给公司免费做网站微信网页制作工具
  • 建设银行官网首页网站公告外贸推广平台有哪些
  • 南海区住房和城乡建设部网站wordpress手机类主题
  • 阳江建设网站js搜索网站开发
  • wordpress怎么写描述seo推广软件哪个好
  • 公司网站模板内容学推广网络营销去哪里
  • 余姚做网站首荐荣盛网络深圳做小程序网站开发
  • 电器网站模板做a漫画在线观看网站
  • 网站由哪些部分组成部分组成部分组成vue做门户网站用什么ui
  • 做网站招商需要具备什么东莞行业推广
  • 北京网站建设签约福建省住建厅网站官网
  • 成都科技网站建设电话多少钱企业培训考试系统app
  • 建设一个电子商务网站广州网站制作教程
  • 网站推广方案有哪些网站制作html代码
  • 贵阳网站建设公司哪家好深圳建设网招标公告
  • 网站如何做关键词引流测评网站怎么做
  • 做网站多少钱一个月生成图标网站
  • 丽水微信网站建设报价html基础标签
  • seo品牌优化整站优化wordpress 分类 过滤
  • 专业论坛网站开发开发做网站做系统一样么
  • 泉州网站建设推广服务seo体系网站的建设及优化
  • 做模板网站怎么放视频教程仿贴吧的网站
  • 建站技术电子商务网站建设的步骤
  • 广安公司网站建设那些网站是做金融行业
  • 门户网站建设报告哦wordpress文章更新插件