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和端口都是服务器的,服务器在这个端口进行监听,客户端进行连接服务器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701205.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE之线程(5)——Java内存模型、内存可见性、volatile关键字

前言 volatile可以理解成轻量级的 synchronized, 它在多CPU开发中保证了共享变量的“可见性”,可见性我们可以理解成是:当一个线程修改一个共享变量时,另一个线程可以读到这个修改的值。由于它不会引起线程的上下文切换和调度&am…

第四届辽宁省大学生程序设计竞赛

比赛经历:2024.5.14简单vp了一个小时只写出了签到题4个然后跑路了 补题:感觉其他题有点太抽象了主要补了一题,在区间问题中数据结构的使用 比赛链接[点我即可] 目录 A.欢迎来到辽宁省赛 B.胜率 F.隔板与水槽 H.取石子 L.区间与绝对值 …

如何给扫描好的3d模型贴图?---模大狮模型网

在数字化设计领域,3D模型的贴图是提升模型逼真度和视觉效果的重要步骤之一。尤其是对于扫描好的3D模型,通过添加适当的贴图,不仅可以增强模型的细节和真实感,还可以为设计带来更加生动的视觉体验。本文将为您详细介绍如何给扫描好…

Node.js 学习笔记 express框架

express express 使用express下载express 初体验 express 路由什么是路由1路由的使用验证的方法 2获取请求报文参数3获取路由参数4响应设置响应报文 express 中间件5中间件全局中间件路由中间件 6静态资源中间件注意事项案例 7请求体数据8防盗链实现防盗链 9路由模块化router E…

Windows里使用ollama本地大模型部署

下载 ollama官网进行下载 下载完后下一步下一步即可 安装完成后验证是否成功,打开命令行输入ollama,有该指令即安装成功 环境变量配置 配置模型下载位置 看自己电脑硬盘情况配置 打开所有ip接口访问权限 如果想要远程调用ollama接口,…

怎么保护云服务器的安全

在云计算技术迅速发展的今天,云服务器被广泛使用,云服务器已经成为企业、组织和个人不可或缺的重要基础设施。然而,云服务器的普及也伴随着日益严峻的安全挑战。今天德迅云安全就和大家了解云服务器安全的重要性,并分享一些常见的…

3ds Max与Maya不同之处?两者哪个更适合云渲染?

3ds Max 和 Maya 都是知名的3D软件,各有其特色。3ds Max 以直观的建模和丰富的插件生态闻名;Maya 则在动画和角色创作方面更为出色。两者都支持云渲染技术,能帮助用户在云端高效完成项目。 一、3ds Max和Maya之间的主要区别: 3ds…

【初阶数据结构】单链表基础OJ题讲解

前言 📚作者简介:爱编程的小马,正在学习C/C,Linux及MySQL。 📚本文收录与初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持…

【大道至简】官方兼容到android13+的获取系统屏幕高度, statusbar,navBar

android在屏幕高度和app高度,statusbar, navigationbar的高度处理上,迭代了好多版本。 android11, android12都有新的api和过时的api标记。 涉及的api类似如下: windowManager,defaultDisplay, Context.display, Deco…

分布式光伏监控系统功能模块详解

目前,分布式光伏发电系统的总容量比较小,并且光伏电站的功率受外界环境影响容易出现大起大落的现象。这使电压调整变得很困难。光伏电站运行维护人员不足,长时间不保养维护会影响光伏电站的发电效率。针对上述问题,鹧鸪云基于无线…

RK3588 camera驱动总结一

RK3588的硬件能力 ISP和VICAP的链接关系: VICAP和ISP是独立的两个图像处理IP, VICAP所采集图像若要通过ISP处理,在驱动层面需要生成VICAP对应接口的v4l2 sub device链接到ISP对应的节点,以提供参数给ISP驱动使用。 1.RKISP 驱动 RKISP驱动主…

java内容快速回顾+SSM+SpringBoot简要概述

文章目录 java基础知识基本知识列表面对对象堆与栈的关系值修改与引用修改异常:错误异常 SSMspringMVCServletSpringMVC:基于 Servlet的 Spring Web 框架, spring控制反转 IoC(Inversion of Control)面向切面 Aop MybatisJDBCMybatis SpringB…