网络编程基础(四)
目录
前言
二、多点通信
2.1 单播
2.2 广播
2.2.1 广播得发送端实现--》类似与UDP的客户端
2.3 组播
2.3.1 组播发送端流程--》类似于UDP的客户端流程
2.3.2 组播的接收端流程---》类似于UDP的服务器端流程
前言
多点通信
一、套接字选项得获取和设置
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);功能:获取或设置套接字在不同层级上的相关属性参数1:要获取或设置的套接字文件描述符参数2:表示要获取或设置的层应用层:SOL_SOCKET传输层TCP:IPPROTO_TCP传输层UDP:IPPROTO_UDP网络层:IPPROTO_IP参数3:当前层的属性名称,见下表所示参数4:要获取或设置的属性值的起始地址参数5:参数4的大小返回值:成功返回0,失败返回-1并置位错误码
1.代码演示
#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建一个套接字文件描述符int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、获取地址快速重用属性的值int res = -1; //接收属性值int reslen = sizeof(res); //接收属性的大小if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &res, &reslen)==-1){perror("getsockopt error");return -1;}//程序执行至此,就获取了默认是否能地址快速重用printf("res = %d\n", res); //0表示默认不能快速重用//3\、设置地址能够快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}//4、再重新获取一次,判断是否设置成功res = -1;if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &res, &reslen)==-1){perror("getsockopt error");return -1;}//程序执行至此,就获取了默认是否能地址快速重用printf("res = %d\n", res); //1表示已经设置成功了return 0;
}
二、多点通信
2.1 单播
1.主机之间存在的是一对一的通信方式,交换机以及路由器对数据只进行转发,不进行复制
2.每次只有两个实体之间进行相互通信,发送端和接收端都是唯一确定的
2.2 广播
1.广播是允许通信实体之间完成一对多的通信方式,网络对其中每一台发送数据的主机信息都进行无条件的复制后并转发给其他所有主机
2.所有主机都会收到广播消息(不管是都愿意接受)
3.广播只能由UDP通信方式来实现
4.广播消息,只能在当前网络下进行转播,不允许传过路由器
5.广播地址:网络号+255
6.官博分为发送端和接收端实现
2.2.1 广播得发送端实现--》类似与UDP的客户端
1、创建用于通信的套接字文件描述符:socket
2、设置该套接字允许发送广播消息:setsockopt ---> SOL_SOCKET ---> SO_BROADCAST
3、绑定IP地址和端口号(可选)
4、向广播地址发送数据:sendto广播地址IP:网络号 + 255端口号:与接收端保持一致
5、关闭套接字:close
代码实现:
#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int rfd = socket(AF_INET, SOCK_DGRAM, 0);if(rfd == -1){perror("socket error");return -1;}//2、填充地址信息结构体://ip:广播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666); //端口号rin.sin_addr.s_addr = inet_addr("192.168.125.255"); //广播ip地址//3、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//4、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1){//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(rfd);return 0;
}
2.2.2 广播的接收端--》类似于UDP的服务器端
1、创建用于通信的套接字文件描述符
2、填充地址信息结构体:ip:广播地址port:与发送端保持一致
3、绑定端口号和IP地址(必须)
4、接受发送端发来的消息:recvfrom
5、关闭套接字:close
代码实现:
#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int rfd = socket(AF_INET, SOCK_DGRAM, 0);if(rfd == -1){perror("socket error");return -1;}//2、填充地址信息结构体://ip:广播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(6666); //端口号rin.sin_addr.s_addr = inet_addr("192.168.125.255"); //广播ip地址//3、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//4、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1){//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(rfd);return 0;
}
2.3 组播
1.由于广播通信过程中,会占用大量的网络宽带,影响正常通信,如果通信的主机较少的话,可以引入组播
2.组播也是实现主机之间一对多的通信方式
3.要求所有接收端主机加入多播组,只有加入多播组的主机才能收到消息
4.对于发送端而言,只需向该多组播中发送消息即可,无需其他设置
5.组播也是使用UDP实现的
6.组播地址:D类网络【224.0.0.0---239.255.255.255】
7.组播也分为发送端和接收端
2.3.1 组播发送端流程--》类似于UDP的客户端流程
1、创建用于通信的套接字文件描述符:socket
2、绑定IP地址和端口号(可选)
3、向组播地址发送数据:sendto广播地址IP:【224.0.0.0 --- 239.255.255.255】端口号:与接收端保持一致
4、关闭套接字:close
代码实现:
#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符:socketint sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd == -1){perror("socket error");return -1;}//2、绑定IP地址和端口号(可选)//3、向组播地址发送数据:sendto//广播地址IP:【224.0.0.0 --- 239.255.255.255】//端口号:与接收端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_port = htons(5555);rin.sin_addr.s_addr = inet_addr("224.1.2.3");//数据的发送//发送数据char wbuf[128] = "";while(1){//从终端获取数据fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//发送给广播消息sendto(sfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&rin, sizeof(rin));printf("发送成功\n");//判断发送的消息if(strcmp(wbuf, "over") == 0){break;}}//5、关闭套接字:closeclose(sfd);return 0;
}
2.3.2 组播的接收端流程---》类似于UDP的服务器端流程
1、创建用于通信的套接字文件描述符:socket
2、将该套接字加入多播组:setsockopt ---> IPPROTO_IP --> IP_ADD_MEMBERSHIP
属性类型:struct ip_mreqn {struct in_addr imr_multiaddr; /* 组播地址 */struct in_addr imr_address; /* 主机ip地址 */int imr_ifindex; /* 设备索引,可以通过 ip ad指令查看, 也可以填0,表示使用默认的索引*/};3、填充地址信息结构体:ip:组播地址port:与发送端保持一致
4、绑定端口号和IP地址(必须)
5、接受发送端发来的消息:recvfrom
6、关闭套接字:close
代码实现:
#include<myhead.h>int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符:socketint rfd = socket(AF_INET, SOCK_DGRAM, 0);if(rfd == -1){perror("socket error");return -1;}//2、将该套接字加入多播组:setsockopt ---> IPPROTO_IP --> IP_ADD_MEMBERSHIP struct ip_mreqn imr;imr.imr_multiaddr.s_addr = inet_addr("224.1.2.3");imr.imr_address.s_addr = inet_addr("192.168.125.113");imr.imr_ifindex = 2;//设置套接字选项,加入多播组if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr))==-1){perror("setsockopt error");return -1;}//3、填充地址信息结构体://ip:组播地址//port:与发送端保持一致struct sockaddr_in rin;rin.sin_family = AF_INET;rin.sin_addr.s_addr = inet_addr("224.1.2.3");rin.sin_port = htons(5555);//4、绑定端口号和IP地址(必须)if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1){perror("bind error");return -1;}//5、接受发送端发来的消息:recvfromchar rbuf[128] = "";while(1){//清空容器bzero(rbuf, sizeof(rbuf));//读取数据recv(rfd, rbuf, sizeof(rbuf), 0);//展示printf("收到广播消息:%s\n", rbuf);//判断广播是否结束if(strcmp(rbuf, "over") == 0){break;}}//6、关闭套接字:closeclose(rfd);return 0;
}
相关文章:
网络编程基础(四)
目录 前言 二、多点通信 2.1 单播 2.2 广播 2.2.1 广播得发送端实现--》类似与UDP的客户端 2.3 组播 2.3.1 组播发送端流程--》类似于UDP的客户端流程 2.3.2 组播的接收端流程---》类似于UDP的服务器端流程 前言 多点通信 一、套接字选项得获取和设置 int getsockopt(int…...
将C++ cv:mat 通过JNI 转换为jbtyearray,传到android端
cv::Mat result ; //此处为C获取到的cv::mat结果对象// 编码为JPEG格式std::vector<uchar> buf;cv::imencode(".jpg", result, buf);// 创建一个新的jbyteArray并设置其大小jbyteArray array env->NewByteArray(buf.size());if (array NULL) {// 处理内存…...
WannaCry勒索软件(CVE-2017-0144)
WannaCry 永恒之蓝 在2017年5月,WannaCry勒索软件爆发了一场全球性的网络安全危机,迅速感染了超过200,000台计算机,波及150多个国家。从医疗保健系统到政府机构,无数组织面临数据被加密和赎金要求的双重威胁。本文将提供关于Wann…...
JavaScript(ES5) 入门
01-简介 1)JavaScript 发展史 [1] 1995年,navigator(导航者),netscape(网景);用户体验性特别好 [2] 表单验证难题,表单验证都是在后台处理.当时处在网速特别慢的时代,发送一个请求,接收响应 需要5分钟左右的时候提高表单验证的速度,想开发一种语言在前端进行表单验证. [3] 1995…...
趣店集团golang一面要个20K,Channel什么情况下会出现死锁,有遇到过吗?
结束后面试官加了VX,并询问方便二面的时间,一直还没回复,拖着拖着给忘啦... 面试题 1、自我介绍 2、你在团队里头负责哪一块,这个物流开放平台流量多大 3、为什么今年3月份被从物流开放团队转到了finance财务部门,感…...
智能化乙级资质延期,行业标准的坚守
智能化乙级资质延期:行业标准的坚守 一、引言 智能化乙级资质是企业在智能化工程设计与施工领域的重要认证,它代表了企业的技术实力和专业水平。为确保企业能够持续满足行业标准,保持竞争力,智能化乙级资质的延期管理显得尤为重要…...
d20(184-190)-勇敢开始Java,咖啡拯救人生
目录 网络通信 网络通信三要素(IP地址,端口号,协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…...
Python 登录表单处理
分析: 处理登录表单以便爬⾍能够抓取需要认证的⽹⻚数据,通常需要模拟登录过程。这可以通过发送带有⽤⼾凭证的POST请求到登录表单的URL来实现。为了保持登录状态,需要处理和保存会话中的 cookies。Python的 requests 库可以⽅便地处理这些任…...
2024.05.27学习记录
1、面经复习: 实际工作经验章节 2、代码随想录刷题:动态规划剩下部分和单调栈 3、rosebush 组件库完成Input 和 AutoComplete部分内容...
BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上
BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的,并如何被填充上GraphicBuffer的,怎么也找不到被填充的GraphicBuffer的来源,最终找到了,它的来源是客户端的…...
48、spfa求最短路
spfa求最短路 题目描述 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…...
安装PyTorch详细步骤
💥注意事项: CPU版和GPU版选一个进行安装即可 如果有Nvidia显卡,则安装cuda版本的PyTorch,如没有nvidia显卡,则安装cpu版。 目前常见的深度学习框架有很多,最出名的是:PyTorch(faceb…...
linux线程,线程控制与线程相关概念
线程概念 线程这个词或多或少大家都听过,今天我们正式的来谈一下线程; 在我一开始的概念中线程就是进程的一部分,一个进程中有很多个线程,这个想法基本是正确的,但细节部分呢我们需要细细讲解一下; 什么…...
第八大奇迹
目录 题目描述 输入描述 输出描述 输入输出样例 示例 输入 输出 运行限制 原题链接 代码思路 题目描述 在一条 R 河流域,繁衍着一个古老的名族 Z。他们世代沿河而居,也在河边发展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑,…...
MySQL:CRUD初阶(有图有实操)
文章目录 📑1. 数据库的操作🌤️1.1 显示当前的数据库🌤️1.2 创建数据库🌤️1.3 选中数据库🌤️1.4 删除数据库 📑2. 表的操作🌤️2.1 查看表结构🌤️2.2 创建表🌤️2.3…...
『大模型笔记』使用 vLLM 和 PagedAttention 快速提供 LLM 服务!
使用 vLLM 和 PagedAttention 快速提供 LLM 服务! 文章目录 一. 使用 vLLM 和 PagedAttention 快速提供 LLM 服务!1.1. PagedAttention二. 参考文献小红书中文字幕视频:https://www.xiaohongshu.com/explore/66502b60000000000500433e官网文档(推荐,里面有动图解释):vLLM:…...
简述vue-loader是什么?使用它的用途有哪些
vue-loader是一个webpack的加载器(loader),主要用于将Vue组件的单文件(.vue文件)转换为JavaScript模块。使用vue-loader的主要用途包括: 解析.vue文件:vue-loader能够解析.vue文件中的模板、样式和脚本,并将它们分离出来进行处理…...
如何远程访问Redis?
远程访问Redis是一种常见的需求,特别是在分布式系统或跨地域网络中。通过远程访问,我们可以轻松地对远程的Redis数据库进行操作和管理。 天联保障数据安全 对于远程访问Redis的安全性问题,我们可以借助天联来保障数据的安全。天联是一种基于…...
#12松桑前端后花园周刊-SolidStart、Vercel融资、Angular18、Nextjs15RC、p5.js、ChromeDevTools引入AI
⚡️行业动态 SolidStart 1.0 元框架发布 Solidjs 核心团队发布其元框架 SolidStart 1.0 正式版,其特点如下:基于文件系统的路由;支持SSR、流式SSR、CSR、SSG渲染模式;通过代码分割、树摇和无用代码删除构建优化;基于…...
vue3 vite title 页面标题设置
效果图: 1. 安装 vite-plugin-html 插件 npm install vite-plugin-html -D2. 修改 vite.config.js import {defineConfig, loadEnv} from vite import { createHtmlPlugin } from "vite-plugin-html" import {resolve} from path import vue from vitej…...
Pixel Couplet Gen入门指南:8-bit UI无障碍访问(色盲模式支持)
Pixel Couplet Gen入门指南:8-bit UI无障碍访问(色盲模式支持) 1. 项目介绍 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型驱动,它将中国传统的春联创作转化为充满怀旧游戏美…...
告别传统知识蒸馏:用‘逆向蒸馏’在MVTec数据集上实现98.5%的异常检测精度
逆向蒸馏:工业质检场景下的异常检测新范式 在工业质检领域,异常检测一直是计算机视觉技术落地的核心挑战之一。传统方法往往受限于样本不平衡、缺陷类型多样等问题,而基于深度学习的方案又面临标注成本高、泛化能力不足的困境。CVPR 2022提出…...
大模型预训练中的损失函数:从交叉熵到代码实现的全方位解析
大模型预训练中的损失函数:从交叉熵到代码实现的全方位解析 在深度学习领域,大语言模型的崛起彻底改变了自然语言处理的格局。这些庞然大物的核心驱动力之一,正是预训练阶段精心设计的损失函数。对于decoder-only架构的模型而言,交…...
JeecgBoot启动配置
一、引入maven指定自己的maven仓库 二、指定JDK 记得apply!!!!然后OK 三、配置MySQL数据库(尽量≥5.7版本) 四、运行db文件夹下的SQL文件 五、后端本地环境(application-dev.yml)指定好数据源 1、M…...
ECharts折线图入门学习:从基础到实战的完整指南
引言 折线图是数据可视化中最常用的图表类型之一,特别适合展示数据随时间变化的趋势。ECharts作为一款功能强大的JavaScript可视化库,提供了丰富的配置选项和交互功能,能够轻松创建出专业、美观的折线图。本文将带领大家从零开始学习ECharts折…...
NVIDIA Profile Inspector完全掌握:从问题诊断到性能优化的效率提升指南
NVIDIA Profile Inspector完全掌握:从问题诊断到性能优化的效率提升指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 许多玩家和创作者拥有高性能NVIDIA显卡,却因配置不当无法…...
基于离散化方法的三维土豆运动微波加热案例:参数化扫描与继承解算子实现离散化
基于离散化方法三维土豆运动微波加热的案例——第一种方法参数化扫描和继承解的算子实现离散化 离散化方式是最常见的实现运动仿真的方法之一,实现离散化的方法有很多,对于COMSOL主要的离散化及种 目前我研究了三种实现离散化的方法,这三种方…...
基于Python的多媒体信息共享平台毕业设计源码
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于Python的多媒体信息共享平台,以满足现代网络环境下多媒体信息传播的需求。具体研究目的如下:构建一个高效、…...
解决Canal 连接数据库超时问题
根本原因:DNS 反向解析导致超时Caused by: java.net.SocketTimeoutException: Timeout occurred, failed to read total 4 bytes in 5000 milliseconds, actual read only 0 bytesat com.alibaba.otter.canal.parse.driver.mysql.socket.BioSocketChannel.read(BioS…...
VCS编译SystemVerilog时,那个‘-P’选项你加对了吗?详解Verdi PLI配置
VCS编译SystemVerilog时,那个‘-P’选项你加对了吗?详解Verdi PLI配置 在芯片验证的日常工作中,VCSVerdi的组合堪称黄金搭档。但当你满怀信心地敲下编译命令,却发现怎么也生成不了关键的fsdb波形文件时,那种挫败感简直…...
