广播和组播(多播)
广播
概述
广播地址
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 的运⾏机制并不影响业务代码的…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
