广播和组播(多播)
广播
概述
广播地址
5.关闭套接字
程序实例
该实例程序一端负责向广播地址上发送消息,一端负责在广播地址上读取消息
消息发送端程序:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.使能广播int optval = 1; int ret = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(void*)&optval,sizeof(optval)); //设置套接字的属性if(ret <= 0){perror("setsockopt error");}//可以绑定本地的 socket 的地址//直接发送消息(定义一个接收消息的地址)struct sockaddr_in addr; //保存接收消息的地址(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));char buf[1024] = {"da jia dou shi liang zai!!!"};while(1){sleep(1);memset(buf,0,1024);fgets(buf,1024,stdin);ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr)); //发送广播if(ret <= 0){perror("sendto error");}printf("sendto size:%d\n",ret);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}
消息读取端程序:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.使能广播int optval = 1; int ret = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(void*)&optval,sizeof(optval));//设置套接字的属性if(ret == -1){perror("setsockopt error");}//从指定的地址接收消息(定义一个接收消息的地址)struct sockaddr_in addr; //保存接收消息的地址(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));//绑定一个 IP 地址ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); //可不绑定if(ret == -1){perror("bind error");exit(-1);}printf("bind success\n");char buf[1024] = {0};struct sockaddr_in send_addr; //用来保存消息发送方的地址while(1){memset(buf,0,1024);memset(&send_addr,0,sizeof(struct sockaddr_in)); //清空结构体socklen_t len = sizeof(send_addr);ret = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&send_addr,&len); //接收广播if(ret <= 0){perror("recv from error");}printf("recv size:%d\n",ret);printf("recv data:%s\n",buf);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}
组播(又称多播)
概述
程序实例
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//可以绑定本地的 socket 的地址//直接发送消息(定义一个接收消息的地址)struct sockaddr_in addr; //保存接收消息端地址信息(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));char buf[1024] = {0};while(1){memset(buf,0,1024);fgets(buf,1024,stdin);int ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr)); //发送消息if(ret <= 0){perror("sendto error");}printf("sendto size:%d\n",ret);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
} #include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//struct ip_mreq {
// struct in_addr imr_multiaddr; /* IP multicast group address */
// struct in_addr imr_address; /* IP address of local interface */
//};//./main MultiIP Portint main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.加入指定的多播组//描述你要加入的多播组struct ip_mreq mreq;memset(&mreq,0,sizeof(mreq));mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); //多播地址//mreq.imr_interface = inet_addr(argv[2]); //本地网址mreq.imr_interface.s_addr = htonl(INADDR_ANY); //让内核自动选择一个网卡int ret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&mreq,sizeof(mreq)); //设置套接字属性if(ret == -1){perror("setsockopt error");}//3.绑定多播地址//从指定的多播地址接收消息(定义一个接收消息的地址)struct sockaddr_in addr; memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));//绑定一个 IP 地址ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr));if(ret == -1){perror("bind error");exit(-1);}printf("bind success\n");char buf[1024] = {0};struct sockaddr_in send_addr; //用来保存消息发送方的地址while(1){memset(buf,0,1024);memset(&send_addr,0,sizeof(struct sockaddr_in)); //清空结构体socklen_t len = sizeof(send_addr);ret = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&send_addr,&len); //接收消息if(ret <= 0){perror("recv from error");}printf("sendIP:%s,sendPort:%d\n",inet_ntoa(send_addr.sin_addr),ntohs(send_addr.sin_port));printf("recv data:%s\n",buf);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
} struct ip_mreq
{struct in_addr imr_multiaddr; /* IP multicast group address */
//多播组的 IP 地址(你要接收哪一个组上的信息)struct in_addr imr_address; /* IP address of local interface */
//本地的 IP 地址,多播组的数据包收发通过本地的哪一个网卡
};
相关文章:
广播和组播(多播)
广播 概述 广播(broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”。并非所有的计算机网络都支持广播…...
【Linux】gdb调试
目录 进入调试查看代码运行代码断点打断点查断点删断点从一个断点转跳至下一个断点保留断点但不会运行该断点 退出调试逐过程逐语句监视跳转至指定行运行结束当前函数 进入调试 指令:gdb 【可执行文件】: 查看代码 :l 【第几行】如果输入指…...
MySQL创建函数及其使用
MySQL创建函数及其使用 一、MySQL 创建函数二、示例 一、MySQL 创建函数 MySQL 函数是一种可重用的代码块,可以接受输入参数并返回值。你可以在 MySQL 中创建各种类型的函数,包括系统函数、用户定义函数和存储过程。在此处,我们将重点关注用…...
大数据-Storm流式框架(四)---storm容错机制
1、集群节点宕机 Nimbus服务器 硬件 单点故障?可以搭建HA jStorm搭建 nimbus的HA nimbus的信息存储到zookeeper中,只要下游没问题(进程退出)nimbus退出就不会有问题, 如果在nimbus宕机,也不能提交…...
SpringBoot项目把Mysql从5.7升级到8.0
首先你需要把之前的库导入到mysql库导入到8.0的新库中。(导入的时候会报错我是通过navcat备份恢复的) 1、项目中需要修改pom文件的依赖 mysql 和 jdbc <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java&…...
RK3568-适配at24c04模块
将at24c04模块连接到开发板i2c2总线上 i2ctool查看i2c2总线上都有哪些设备 UU表示设备地址的从设备被驱动占用,卸载对应的驱动后,UU就会变成从设备地址。at24c04模块设备地址 0x50和0x51是at24c04模块i2c芯片的设备地址。这个从芯片手册上也可以得知。A0 A1 A2表示的是模块对…...
Banana Pi BPI-W3 ArmSoM-W3之RK3588-MIPI-DSI屏幕调试笔记
一. 简介 本文是基于RK3588平台,MIPI屏调试总结。 二. 环境介绍 硬件环境: ArmSoM-W3 RK3588开发板、MIPI-DSI显示屏( ArmSoM官方配件 )软件版本: OS:ArmSoM-W3 Debian11 三. MIPI屏幕调试 3.1 调试总览,调试步骤分…...
Git的远程仓库
Git的远程仓库 添加远程仓库从远程库克隆 添加远程仓库 你在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作…...
Linux虚拟网络设备—Veth Pair
veth是Virtual Ethernet Device的缩写,是一种成对出现的Linux虚拟网络接口设备。它最常用的功能是用于将不同的Linux network namespaces 命名空间网络连接起来,让二个namespaces之间可以进行通信。我们可以简单的把veth pair理解为用一根网线࿰…...
Parcelable protocol requires the CREATOR object to be static on class com.test
对于 Parcelable 协议,确实要求 CREATOR 对象必须是静态的。这是因为在反序列化过程中,需要通过 CREATOR 对象来创建 Parcelable 对象的实例。 根据错误信息,涉及到了com.test类中的问题。通常情况下,如果一个内部类需要实现 Par…...
Python的Matplotlib库:数据可视化的利器
引言: Matplotlib是一款强大的Python库,专为数据可视化而设计。无论是绘制折线图、散点图、柱状图还是饼图,Matplotlib都能提供灵活且易于操作的绘图方法。 1. Matplotlib简介 Matplotlib是Python中最流行的绘图库之一,被广泛应…...
普通人做抖店,需要具备什么条件?一篇详解!
我是电商珠珠 抖音小店的热度一直很高,对于想开店的新手来说,不知道需要什么条件,今天我就来给大家详细的讲一下。 一、营业执照 在入驻抖音小店之前,需要准备一张营业执照。 营业执照一共有两种类型,一种为个体工…...
Django分页功能的使用和自定义分装
1. 在settings中进行注册 # drf配置 REST_FRAMEWORK {DEFAULT_AUTHENTICATION_CLASSES: (# rest_framework_jwt.authentication.JSONWebTokenAuthentication,rest_framework_simplejwt.authentication.JWTAuthentication,rest_framework.authentication.SessionAuthenticatio…...
React-hooks有哪些用法?
React Hooks 是 React 16.8 引入的一种新的特性,用于在函数组件中使用状态和其他 React 特性。下面列举了一些常见的 React Hooks 的用法: 1:useState:用于在函数组件中添加状态。: import React, { useState } from react;function MyComponent() {const [count, setCou…...
2024年CFA一级公示表,一级quicksheet(内附分享链接)
随着金融行业的迅速发展,CFA(特许金融分析师)认证成为了许多金融从业者追求的目标。2024年CFA一级公示表资料的自学,为那些渴望在金融领域取得突破的人们提供了宝贵的机会。 通过自学CFA一级公示表资料,我们可以深入了…...
【Kubernetes】 Kubernetes 了解云原生的原理
Kubernetes 了解云原生的原理 云原生是一种软件设计、实施和部署方法,旨在充分利用基于云的服务和交付模型。云原生[1]应用程序通常也使用分布式架构运行。这意味着应用程序功能被分解为多个服务,然后分布在托管环境中,而不是整合到单个服务…...
什么是jquery
jquery是一个javascript库;用来简化javascript编程;基本是前端必备; 看一下示例; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <script src"https://cdn.staticfile.org/j…...
竞赛选题 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别
文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...
新华三路由器+华为交换机,实现华为交换机指定端口访问外网
需求背景: 多台服务器使用华为交换机组建了局域网,需要让交换机的指定端口可以访问外网。 需求分析: 交换机组建的局域网是二层组网,需借助路由器接入外网,然后通过DHCP分配内网IP地址给交换机指定端口连接的设备。 …...
Java面试(JVM篇)——JVM 面试题合集 深入理解JVM虚拟机
关于什么是JVM? 作用: 运⾏并管理Java 源码⽂件所⽣成的Class⽂件,在不同的操作系统上安装不同的JVM ,从⽽实现了跨平台的保证。 ⼀般情况下,对于开发者⽽⾔,即使不熟悉JVM 的运⾏机制并不影响业务代码的…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
