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

网络编程基础(四)

目录

前言

 二、多点通信

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月&#xff0c;WannaCry勒索软件爆发了一场全球性的网络安全危机&#xff0c;迅速感染了超过200,000台计算机&#xff0c;波及150多个国家。从医疗保健系统到政府机构&#xff0c;无数组织面临数据被加密和赎金要求的双重威胁。本文将提供关于Wann…...

JavaScript(ES5) 入门

01-简介 1)JavaScript 发展史 [1] 1995年,navigator(导航者),netscape(网景);用户体验性特别好 [2] 表单验证难题,表单验证都是在后台处理.当时处在网速特别慢的时代,发送一个请求,接收响应 需要5分钟左右的时候提高表单验证的速度,想开发一种语言在前端进行表单验证. [3] 1995…...

趣店集团golang一面要个20K,Channel什么情况下会出现死锁,有遇到过吗?

结束后面试官加了VX&#xff0c;并询问方便二面的时间&#xff0c;一直还没回复&#xff0c;拖着拖着给忘啦... 面试题 1、自我介绍 2、你在团队里头负责哪一块&#xff0c;这个物流开放平台流量多大 3、为什么今年3月份被从物流开放团队转到了finance财务部门&#xff0c;感…...

智能化乙级资质延期,行业标准的坚守

智能化乙级资质延期&#xff1a;行业标准的坚守 一、引言 智能化乙级资质是企业在智能化工程设计与施工领域的重要认证&#xff0c;它代表了企业的技术实力和专业水平。为确保企业能够持续满足行业标准&#xff0c;保持竞争力&#xff0c;智能化乙级资质的延期管理显得尤为重要…...

d20(184-190)-勇敢开始Java,咖啡拯救人生

目录 网络通信 网络通信三要素&#xff08;IP地址&#xff0c;端口号&#xff0c;协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…...

Python 登录表单处理

分析&#xff1a; 处理登录表单以便爬⾍能够抓取需要认证的⽹⻚数据&#xff0c;通常需要模拟登录过程。这可以通过发送带有⽤⼾凭证的POST请求到登录表单的URL来实现。为了保持登录状态&#xff0c;需要处理和保存会话中的 cookies。Python的 requests 库可以⽅便地处理这些任…...

2024.05.27学习记录

1、面经复习&#xff1a; 实际工作经验章节 2、代码随想录刷题&#xff1a;动态规划剩下部分和单调栈 3、rosebush 组件库完成Input 和 AutoComplete部分内容...

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的&#xff0c;并如何被填充上GraphicBuffer的&#xff0c;怎么也找不到被填充的GraphicBuffer的来源&#xff0c;最终找到了&#xff0c;它的来源是客户端的…...

48、spfa求最短路

spfa求最短路 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…...

安装PyTorch详细步骤

&#x1f4a5;注意事项&#xff1a; CPU版和GPU版选一个进行安装即可 如果有Nvidia显卡&#xff0c;则安装cuda版本的PyTorch&#xff0c;如没有nvidia显卡&#xff0c;则安装cpu版。 目前常见的深度学习框架有很多&#xff0c;最出名的是&#xff1a;PyTorch&#xff08;faceb…...

linux线程,线程控制与线程相关概念

线程概念 线程这个词或多或少大家都听过&#xff0c;今天我们正式的来谈一下线程&#xff1b; 在我一开始的概念中线程就是进程的一部分&#xff0c;一个进程中有很多个线程&#xff0c;这个想法基本是正确的&#xff0c;但细节部分呢我们需要细细讲解一下&#xff1b; 什么…...

第八大奇迹

目录 题目描述 输入描述 输出描述 输入输出样例 示例 输入 输出 运行限制 原题链接 代码思路 题目描述 在一条 R 河流域&#xff0c;繁衍着一个古老的名族 Z。他们世代沿河而居&#xff0c;也在河边发展出了璀璨的文明。 Z 族在 R 河沿岸修建了很多建筑&#xff0c…...

MySQL:CRUD初阶(有图有实操)

文章目录 &#x1f4d1;1. 数据库的操作&#x1f324;️1.1 显示当前的数据库&#x1f324;️1.2 创建数据库&#x1f324;️1.3 选中数据库&#x1f324;️1.4 删除数据库 &#x1f4d1;2. 表的操作&#x1f324;️2.1 查看表结构&#x1f324;️2.2 创建表&#x1f324;️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)&#xff0c;主要用于将Vue组件的单文件(.vue文件)转换为JavaScript模块。使用vue-loader的主要用途包括&#xff1a; 解析.vue文件&#xff1a;vue-loader能够解析.vue文件中的模板、样式和脚本&#xff0c;并将它们分离出来进行处理…...

如何远程访问Redis?

远程访问Redis是一种常见的需求&#xff0c;特别是在分布式系统或跨地域网络中。通过远程访问&#xff0c;我们可以轻松地对远程的Redis数据库进行操作和管理。 天联保障数据安全 对于远程访问Redis的安全性问题&#xff0c;我们可以借助天联来保障数据的安全。天联是一种基于…...

#12松桑前端后花园周刊-SolidStart、Vercel融资、Angular18、Nextjs15RC、p5.js、ChromeDevTools引入AI

⚡️行业动态 SolidStart 1.0 元框架发布 Solidjs 核心团队发布其元框架 SolidStart 1.0 正式版&#xff0c;其特点如下&#xff1a;基于文件系统的路由&#xff1b;支持SSR、流式SSR、CSR、SSG渲染模式&#xff1b;通过代码分割、树摇和无用代码删除构建优化&#xff1b;基于…...

vue3 vite title 页面标题设置

效果图&#xff1a; 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…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...