当前位置: 首页 > 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…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...