5.13网络编程
只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的,因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。
socket套接字是一种用于网络间进行通信的方式,通过tcp与udp以及ip的方式与另外一个主机进行通信,为什么从传输层往下进行计算,因为应用层的方式协议非常的灵活,只要是有一个头和内容即可。但是在网络层数据链路层和传输层等不仅需要满足在两端的数据,还得要满足在硬件上的规定上。
Linux在主机端都是小端存储的,在网络端是大端进行存储的,记忆方式就是那个图这个是大端存储的方式。
所以说将在主机端的信息发布到网络上的时候需要先将信息将小端的方式转化为大端的方式。
【注意】区分大小端的时候是按字节进行划分的,字节内的数据是有序的。分为高字节和低字节,所以可以通过将数据打印为char类型数据判断(ASCII)
【注意】转换端口或者是ip进行大小端的转化需要使用不同的函数因为两者的长度不同。
htonl32位的(host与net)【转化ip】将ip主机字节序转化为网络字节序。
htons16位的【转化端口】将端口的主机字节序转化为网络字节序。
当然可以转过去也可以转回来,ntohl和ntohs函数
大小端的转换并不常用,因为我们常常使用char *字符串类型,所以使用下面的函数
一般在写的时候都是char *ip字符串类型,在进行传输的不便于使用192.如果是字符串类型仅这一小部分这个就是三个字节,所以将这个点分十进制转化为32位01数转化为int类型数字
int inet_aton(char *ip, struct in_addr*inp)将char*类型转化为大端方式转化为struct in_addr,与下面的函数有区别
in_addr_t inet_addr(char *ip)将char*转化为in_addr_t类型(小端的方式)
char* inet_ntoa()将大端转化为char*
存储IP和端口定义的结构体struct sockaddr_in存储ipv4类型数据
【注意】但是一套接口接口可以适用于ipv4和ipv6的通信,所以bind等函数中使用这样一种struct sockaddr通用的一个类似的说明符实际上却没有这样的一个结构体定义,所以在实际应用的时候将sockaddr_in或者sockaddr_in6强转为sockaddr类型
【注意】sockaddr_in 是一个socket类,型的结构体存储ipv4 or 6,存储ip只是这个ipstruct in_addr类型存储用和端口号。struct in_addr 与 in_addr_t类型是一 一对应的,就是说在结构体中实际上存储的就是in_addr_t,所以说在使用的时候注意区分两者。
DNS dns将域名转化为ip
可以多个域名映射同一个ip,可以多个ip映射同一个域名(例如百度)。
gethostbyname给域名变ip,得到更多细节的函数是getaddrinfo函数可以通过一个域名得到所有的ip地址。
socket基于TCP进行通信的方式
socket设置一个socket文件对象(实际上是一个结构体)(理解为开辟一片区域,分配一个名字)
理解socket端点对象是开辟两个缓冲区:输入缓冲区和输入缓冲区。这个地方其实是和read和write系统调用函数类似将用户态的信息传递到内核态,然后将内核态中的信息传递到网卡上去然后传递到网络上,另一端同样从网卡上接收数据,读取到内核态中,然后传到用户态。
最开始创建的这个socket节点只是负责接收信号进行排队。
【注意】这个地方的出入缓冲区是recv函数,是从网卡上接收数据!!!
bind就是设置服务器监听的端口,还有ip。理解这个地方是将自己的自己的ip和端口进行绑定,确定自己要监听的端口。(服务器端是固定端口号的,所以说在进行通信的时候,客户端需要知道服务器端的ip和端口号一般的端口号(http)都是固定的什么80,443)。
在自己进行端口的绑定的时候,不要使用系统定义的预留的端口1-1024,用8080及以上
为什么需要绑定ip,一般的电脑都是一个网卡,电脑有时也可能是有多个网卡,会有多个ip地址,所以绑定ip。当然也可以两个网卡都可以接收,想让两个网卡都接收就用0.0.0.0。
如果bind连接的时候,进行测试的时候,会用到ip127.0.0.1
【注意】在服务器端是自己设置一个端口,在客户端进行随机分配端口,因为客户端如果也是固定端口,这样的话不同的服务程序可能产生冲突,所以采用固定端口的方式。
这个指令查看端口有没有在使用
listen:监听端口
bind只是绑定,但是listen才开始监听
第二个参数,套接字挂起的最大端口号。全链接队列和半链接队列的长度之和。
调用listen函数会在服务器端维护两个缓冲区,是全链接队列和半链接队列。第一次握手完成就将socket节点放到半链接队列中,当完成三次握手的时候就放在全链接队列中。
全链接队列和半链接队列维护队列的数量的多少是在工作中不断确定的。
实际上客户机和服务器是没有什么本质区别的,所以说客户机也可以是服务器,同理。一般客户端不需要bind和listen。
【注意】当进行一次listen之后该socket节点就直接变成一个监听和接收队列,只进行监听和接收,后续当有新的connect的时候就不再需要connect了,就直接将相应的节点放到监听队列中。
connect进行了三次握手
只有当服务器端进行listen之后,客户端才能与服务器端建立链接。这个时候会报错,listen refused。
【注意】可以有多个客户端与整个服务器进行通信,都是通过socket一个节点接收信息
当完成三次握手以后,就已经建立了链接,(服务器端)socket节点就放到了全链接队列中。
accept在accept的时候是将原来的socket端点进行复制一个socket节点进行通信。(下文why)
借助于文件描述符找到节点的位置。
【注意】因为有多台客户机与服务器进行连接(1.最开始创建的socket节点只是负责三次握手,四次挥手都不负责),2.在基于TCP的连接中,给每一个客户端分配一个socket节点进行服务。这个时候客户端就会和服务器端新的socket节点进行通信而不会和原来的socket节点进行通信。
可以从accept进行三次握手以后,在新的socket节点中就可以获取客户端的ip和端口。也就是accept函数中后面的两个参数,因为ipv4和ipv6是不一样的,所以还需要传一个长度。一般就是用NULL,不需要显示打印出来的时候。当需要答应的时候注意将网络大端转化为主机小端模式。
accept是一个阻塞函数,当全链接队列为空的时候,服务端会阻塞在这个位置。
会返回新建立的socket节点的文件描述符。
recv和send进行通信
send就是将数据放到输出缓冲区中,recv就是从缓冲区中取出数据。传给网卡不关这个函数的关系。内核机制找到合适时间传到网卡,不关自己的操作,同样网卡也是找合适的时机被拿出数据
所以说这个地方可能会出现毡包,粘包的问题,因为放在缓冲区中的数据可能不会直接一次发送出去,或者不会立即发送和别的一块。
【注意】最近的函数中空标志不需要的位置一般都是用0
close关闭连接
【注意】TCP在客户端只需要close一次即可,服务器端需要close两次,一次接收的socket节点,一次进行通信socket节点
close之后可能不会立即进行四次挥手,close只是一次调用,由内核进行处理。同理ctrl+c可能不会由系统执行立即挥手。
select既可以随时进行监听和发送
【注意】两端都需要进行判断,如果说recv接收到的数据一直都往外爆出0,就有点像那个管道,所以说当读出的数据是0的时候就进行关闭。
8081使用户端的端口处于time_wait状态,并不是8081是处于time_wait状态。
客户机和服务器那一端都可以先关闭,先关闭的一端是处于time_wait状态。
客户端的端口处于time_wait时,没有关系,因为客户端的端口是进行随机分配的
int reuse = 1;
setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
将这个语句加到服务器的socket函数和bind函数中间就可以。
断开重连(只是可以连上,但是不能接着进行)
会有应用场景,就是当客户端关掉断开连接服务器一直在工作,客户端再次上线的时候仍然可以工作。
就比如说一个音乐软件通过数据传输信息,暂停音乐以后再连接。
断开重连相比较于select函数就是分别取监听sockfd,STDIN_FILENO,
netstat命令 netstat -an 观察连接的状态,查看网络ip和端口的连接情况。
tcpdump -w 保存抓包数据在工作中很重要,当客户端传不过来数据,或者是服务器端不能传输数据的时候,就是不正常的时候,也需要在Linux系统中也进行抓包,抓包得到的数据用wireshark打开这个文件抓包数据分析。
DDos修改客户端内核为一次连接,这样的话
UDP底层基于udp
UDP相较于TCP只有一个socket节点对象,如何判断将数据传送给谁,这个时候就需要在发送数据的时候带上要发送给那个客户机的socket节点ip和端口。
【注意】对比TCP和UDP,因为UDP是只有一个socket节点这样的话,需要服务器在第一次recvfrom的时候收到数据的时候将客户端的ip和端口保存下来。相比而言就需要一个额外的结构体socket结构体对象。
recvfrom的后面的两个参数是收取对方的socket节点套接字,以及长度和指针。发数据的时候指明要发送的socket对象。
需要客户端先发送数据给服务器,然后服务器才能知道客户端的ip和端口号
当一端的关闭的时候,另外一端是不知道的。
框架:
通过网络通信(网络层和传输层的标准规范比较严格,考虑传输层和网络层socket定义)(应用层的传输规定相当的灵活不需要)--------------》
将主机上的数据传递到网络上去(注意数据存储的大小端的问题)--------》
基于传输层的两种不同的TCP和UDP分为两种逻辑
TCP:
客户端: socket(得知服务器的ip和端口)----------------------------------------------------》
服务器端:socket(建立一个只是监听的socket节点)-----》bind(设置监听的端口和主机进行监听的ip)-------------》listen(设置全链接和半链接队列进行监听)
客户端: connect(进行三次挥手)------------------------------>send和recv函数(将用户态数据到内核态)
服务器端: accept(建立新的socket节点用于通信)-------------->send和recv函数(将用户态数据送到内核态)
UDP:
注意一些问题:
1. 在主机和网络上进行传输时注意大小端问题
2. 注意区分struct in_addr 与 in_addr_t其实一回事,struct中有in_addr_t
3. 注意在UDP设置新的sockaddr_in的时候记得要及时进行memset设置
4. 其实客户端和服务器输入的服务器的ip和端口都是服务器的,服务器在这个端口进行监听,客户端进行连接服务器
相关文章:

5.13网络编程
只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的,因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…...
那些年使用过的UA头
一些WAF会根据扫描器UA头进行屏蔽 UA头 在sqlmap 中可以使用 –random-agnet /xx.txt 来更换UA头 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60 Opera/8.0 (Windows NT 5.1; U; en) Mozi…...

IT技术产品:开发者极为重要的思维习惯
1、特色内容预告 1、我用敏捷开发思维,提高工作效率。 2、我用代码批判思维,逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员,是哪些重要的专业习惯,让我如此优秀? 2、可以免费获取到的IT资源 1、《软件工程&a…...
软件产品质量模型及其子特性
一、功能性 子特性: 功能的完备性 功能正确性 功能适合性 功能性的依从性 二、性能效率 子特性: 时间特性 资源利用性 容量 性能效率的依从性 三、兼容性 子特性: 共存性 互操作性 兼容性的依从性 四、易用性 子特性: 可辨识性…...
神经网络中的误差反向传播(Backpropagation)方法理解
想象一下,神经网络就像是一个复杂的迷宫,里面有许多交叉路口(神经元),每个路口都有指示牌告诉你往哪个方向走(权重),而你的目标是找到从入口到出口的最佳路径,使得从起点…...
Day 32 shell变量及运算
一:变量概述 1.什么是变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念 变量可以通过变量名访问,在指令式语言中,变量通常是可变的;在某些条件下也是不可变的 2.变量的规则 命名只…...

八、VUE内置指令
一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 四、VUE事件处理 五、VUE计算属性 六、Vue监视属性 七、VUE过滤器 七、VUE内置指令 九、VUE组件 v-text 向其所在的节点中渲染文本内容。 (纯文本渲染)与插值语法的区别:v-text会替换掉节点中的内容,{{x…...
学习笔记:IEEE 1003.13-2003【POSIX PSE53接口列表】
一、POSIX PSE53接口列表 根据IEEE 1003.13-2003,整理了POSIX PSE53接口API(一共126个),每个API支持链接查看。 IEEE POSIX接口online搜索链接: The Open Group Base Specifications Issue 7, 2018 edition 详细内…...
springboot logback 日志注入安全问题 统一处理
背景 日志注入一般指的是恶意用户输出换行等内容,混淆正常的日志,导致排查问题是无法正确定位问题,因此,我们需要对要打印的日志内容进行过滤。 但是,如果是每个接口单独处理的话,成本较高,因此…...
linux进阶高级配置,你需要知道的有哪些(13)-Squid代理服务器
1、squid代理的作用:缓存网页对象,减少重复请求 2、代理的基本类型 传统代理:适用于Internet互联网,需明确指定服务端(浏览器需要配置) 透明代理:适用于共享上网网关,不需要指定服务…...

SpringBoot自动装配(二)
近日,余溺于先贤古哲之文无法自拔。虽未明其中真意,但总觉有理。遂抄录一篇以供诸君品鉴——公孙鞅曰:“臣闻之:‘疑行无名,疑事无功。’君亟定变法之虑,殆无顾天下之议之也。且夫有高人之行者,…...

数据结构 顺序表1
1. 何为顺序表: 顺序表是一种线性数据结构,是由一组地址连续的存储单元依次存储数据元素的结构,通常采用数组来实现。顺序表的特点是可以随机存取其中的任何一个元素,并且支持在任意位置上进行插入和删除操作。在顺序表中…...
C++基础-编程练习题1
文章目录 一、哥德巴赫猜想二、哥德巴赫猜想2三、打印成绩单四、成绩输入输出五、数组输出奇数位偶数位 一、哥德巴赫猜想 【试题描述】 哥德巴赫提出了以下的猜想:任何一个大于 2 的偶数都可以表示成 2 个质数之和。 质数是指除了 1 和本身之外没有其他约数的数&a…...

四十九坊股权设计,白酒新零售分红制度,新零售策划机构
肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标:厦门,我是易创客肖琳 深耕社交新零售行业10年,主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店,只靠49个男人用一套方法卖白酒…...

如何将公众号添加到CSDN个人主页
1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下: 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 ,例如我的个人公众号 htt…...
64K方法数限制原理及解决方案
64K限制的原因 Android APK文件本质上是一个压缩文件,它包含的classes.dex文件是可执行的Dalvik字节码文件,这个.dex文件中存放的就是编译后的Java代码。Dalvik可执行文件规范限制了单个.dex文件最多引用的方法数是65536个。其中包含联网Android Framew…...

产品品牌CRUD
文章目录 1.renren-generator生成CRUD1.数据库表设计1.数据表设计2.分析 2.代码生成器生成crud1.查看generator.properties(不需要修改)2.修改application.yml 连接的数据库修改为云数据库3.启动renren-generator模块4.浏览器访问 http://localhost:81/5…...

惠普发布全新AI战略,重塑办公空间 引领企业智能化新浪潮
近日、全球知名科技公司惠普在北京隆重举办了以“用智能,开启无限可能”为主题的2024惠普商用AI战略暨AI PC新品发布会,此次盛会标志着惠普在人工智能领域迈出了重要一步,惠普紧跟时代步伐,推出了更高效、更安全、更灵活的AI PC产…...

python中的数据可视化:极坐标散点图
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python中的数据可视化: 极坐标散点图 [太阳]选择题 关于以下代码输出结果的说法中正确的是? import matplotlib.pyplot as plt import numpy as np n 150 r 2 * np.r…...

5.12.1 Detecting and classifying lesions in mammograms with Deep Learning
计算机辅助检测 (CAD) 系统的开发是为了帮助放射科医生分析筛查性乳房 X 光检查,深度 CNN 有可能彻底改变医学图像分析。我们提出了一种基于最成功的对象检测框架之一 Faster R-CNN 的 CAD 系统。该系统无需任何人为干预即可检测乳房 X 光照片上的恶性或良性病变并对…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

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