Linux高级编程:网络

news/2024/4/21 13:11:19/文章来源:https://blog.csdn.net/Ricky111zzz/article/details/136468905

回顾:

进程间的通信:

同一主机内通信:

        传统的进程间通信方式(管道、信号);

        IPC对象(共享内存,消息队列,信号量集);

不同主机间进程的通信:

IP地址:

        作用:用来标识网络中一台主机的,解决了如何在网络中找到一台主机

        IP地址 == 网络位 + 主机位
        IP地址的分类:  点分十进制(方便人看)   ipv4  712934

 

网关(局域网的门)192.168.0.1         //  ip地址 与 子网掩码(默认网络掩码:255.255.255.0)                                                                   与运算  192.168.0.0(网络号)

设备(路由器)--- 路由(route)--- 网络路径的选择

192.168.0.255 boardcast广播  全发

C类地址最多连接254台主机

端口号:

        编号----16位的数据、2个字节、范围:0~65535

        作用:唯一标识计算机中用于通信的某个进程的

IP + 端口号 --》网络中通信的进程  //地址

源IP + 源端口  《=》目标IP +  目标端口

通信的四元组

网络链接:

  物理层面:

                有线 -- wifi -- 宽带(光纤)--- 光信号

                5G -- 毫米波

  逻辑层面:

                osi标准(open system interconnect)

OSI 模型  ===》开放系统互联模型  ==》分为7层:

7应用层

6表示层          加密解密  gzip

5会话层          网络断开,连接状态,keep-close keep-alive

4传输层tcp      udp  协议  文件    视频,音频  ipx 
3网路层ip        NAT      网际层

2链路层          交 换机  数据的格式化  帧 校验

                     尾|1010 1010|头  --- 帧格式。

1物理层          100Mb/8  10Gbits   100MB 同轴电缆,发送比特流

TCP五层或四层结构

举例:网络的封包和解包

       

每一层都封包协议,因为要保证各个层的功能实现,这是由协议实现的

协议:

IP--》mac地址   //ARP地址解析协议 ,mac地址就是物理地址

mac地址--》IP   // 反向地址协议

IPV4 标准,因为只有32位  不够用了  ----》ipv6  128位可以解决ip地址不够用的问题

TCP/UDP协议:

TCP(Transmission Control Protocal)

        特点:(1.面向连接  2.可靠连读,3.字节流)  //字节流 一个字节一个字节发

通过内部各层特性保证数据正确性

        

socket

1、socket函数接口-系统调用

2、socket是一种特殊的文件,专门用于“网络通信,用于不同主机间进程的通信,相同主机也可以

3、socket是网络通信中,抽象出来的函数接口

基于TCP的模型:

两种常见的网络通信模型:

                1、C/S  client - server   客户端/服务器模型  专有的客户端

                2、B/S  browser - server  浏览器--通用的客户端

tcp通信 步骤

1、进行连接   2、进行通信

     举例

客户端://主动的一方,发起通信请求                          服务器端:

socket      //买了一部手机                                             socket  买了一部手机

bind       (可选)   绑定一个sim卡                              bind       绑定sim卡

connect    拨打电话                                                      listen     待机 -- 来电

write          收发消息                                                     accept    接听电话

read                                                                              write 

close                                                                             read    close

1、socket()

#include <sys/types.h>       
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

        功能:程序向内核提出创建一个基于内存的套接字描述符

        参数:

                @domain  地址族,PF_INET == AF_INET ==>互联网程序

                                                PF_UNIX == AF_UNIX ==>单机程序

                @type     套接字类型:
                                SOCK_STREAM  流式套接字 ===》TCP   
                                SOCK_DGRAM   用户数据报套接字===>UDP
                                SOCK_RAW     原始套接字  ===》IP

                @protocol  protocol 协议 ==》0 表示自动适应应用层协议。

        返回值:成功 返回申请的套接字id   ;失败  -1。

网络接口
    1、sokcet  套接字 ==》BSD socket ==》用于网络通信的一组接口函数。
    2、ip+port 地址+端口===》地址用来识别主机

bzero 

        结构体清零

       #include <strings.h>

       void bzero(void *s, size_t n);

       

inet_addr()   

         将ip地址转换为二进制 并以网络字节序(大端)放置

       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>

        in_addr_t inet_addr(const char *cp);
 

htonl 

       #include <arpa/inet.h>
       uint16_t htons(uint16_t hostshort);     将端口转换为字节序放置

2、bind()

       #include <sys/types.h>         
       #include <sys/socket.h>

        int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

        功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。

注意:如果是客户端,则该函数可以省略,由默认接口发送数据。

         参数:      

                @sockfd 之前通过socket函数创建的文件描述符,套接字id
                @my_addr 是物理接口的结构体指针。表示该接口的信息。

                      struct sockaddr      通用地址结构
                     {
                          u_short sa_family;  地址族
                          char sa_data[14];   地址信息
                      };

                      转换成网络地址结构如下:
                      struct _sockaddr_in    ///网络地址结构
                      {
                          u_short           sin_family; 地址族
                          u_short           sin_port;   ///地址端口
                         struct in_addr  sin_addr;   ///地址IP
                          char               sin_zero[8]; 占位
                      };

                      struct in_addr
                      {
                          in_addr_t s_addr;
                      }

                     @socklen_t addrlen: 参数2 的长度。

3、connect()

UDP:

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

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

相关文章

【Docker】转存Docker容器镜像

目录 导出 拷贝到其他服务器 导入 启动被导入镜像镜像保存 加载镜像 运行测试 导出 把正在运行中的容器导出到一个文件压缩包&#xff0c;然后可以传输到其他服务器进行运行 #导出容器文件系统成为一个tar文件 docker export #导入tar文件&#xff0c;成为一个镜像 dock…

基于OpenCV的图形分析辨认03

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

macos jupyter notebook字体的修改

终端codemirror 记事本打开 搜索font-family 修改font-size保存即可

资深测试总结,接口自动化测试常用配置文件(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、常用的配置文件…

RabbitMQ队列

RabbitMQ队列 1、死信的概念 ​ 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说,producer将消息投递到broker或者直接到queue里了&#xff0c;consumer 从 queue取出消息进行消…

电脑数据丢失是什么原因 易我数据恢复软件下载 easyrecovery数据恢复软件下载 电脑数据删除了怎么恢复 电脑数据库损坏了怎么找回

目录 一、电脑数据丢失是什么原因 二、电脑数据丢失如何恢复 三、EasyRecovery恢复电脑数据的方法介绍 电脑是我们大家熟悉并且常用的数据存储设备&#xff0c;也是综合性非常强的数据处理设备。对于电脑设备来讲&#xff0c;最主要的数据存储介质是硬盘&#xff0c;电脑硬…

MySQL 常用优化方式

MySQL 常用优化方式 sql 书写顺序与执行顺序SQL设计优化使用索引避免索引失效分析慢查询合理使用子查询和临时表列相关使用 日常SQL优化场景limit语句隐式类型转换嵌套子查询混合排序查询重写 sql 书写顺序与执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM &…

Web安全:报错注入原理分析,报错注入步骤,报错注入常用函数

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全自学教程》 报错注入 一、什么是报错注入二、执行原理1. 代码逻辑…

设计模式:观察者模式 ⑧

一、思想 观察者模式是一种常见的设计模式&#xff0c;也称作发布-订阅模式。它主要解决了对象之间的通知依赖关系问题。在这种模式中&#xff0c;一个对象&#xff08;称作Subject&#xff09;维护着一个对象列表&#xff0c;这些对象&#xff08;称作Observers&#xff09;都…

C#实现选择排序算法

以下是使用C#实现选择排序算法的示例代码&#xff1a; using System;class SelectionSort {static void Main(string[] args){int[] arr { 64, 25, 12, 22, 11 };Console.WriteLine("排序前&#xff1a;");PrintArray(arr);SelectionSortAlgorithm(arr);Console.Wr…

无人机|四旋翼运动动力学建模及位置控制仿真

目录 前言无人机模型推导动力学模型运动学模型 无人机模型仿真控制器设计 前言 本文将实现对无人机动力学以及运动学的公式推导完成建模&#xff0c;该模型以电机转速为输入&#xff0c;以无人机的状态量为输出。并在此基础上实现位置控制&#xff0c;以期望位置作为输入&…

Covalent Network(CQT)构建 Web3 最大的结构化数据集,开拓AI、安全性和数据质量的融合

人工智能浪潮正在对各行各业进行重塑&#xff0c;随着格局的不断演变&#xff0c; Covalent Network&#xff08;CQT&#xff09;正在成为核心参与者。人工智能以其对庞大的结构化数据集的依赖而闻名&#xff0c;而 Covalent Network&#xff08;CQT&#xff09;的广泛数据集正…

Ubuntu20.04: UE4.27 中 Source Code 的编辑器下拉框没有 Rider选项

问题描述 最近想用 Rider 作为 UE4 开发的 IDE&#xff0c;但安装好 Rider 后&#xff0c;发现编辑器下拉框中没有 Rider 的选项&#xff0c;我检查了 UE4 的插件&#xff0c;发现 Rider Integration 插件已经安装且启用的。 环境&#xff1a;Ubuntu 20.04 UE4.27 Rider2023…

redis 性能优化一

目录 前言 尾延迟 前言 说到redis 性能优化&#xff0c;优化的目的是什么&#xff1f;提高响应&#xff0c;减少延迟。就要关注两点&#xff0c;一是尾延迟&#xff0c;二是Redis 的基线性能。只有指标&#xff0c;我们的优化&#xff0c;才有意义&#xff0c;才能做监控以及…

【总结】补码在运算中溢出的情况(单符号位补码+双符号位补码)

总结补码在运算中溢出的情况 在此默认补码为有符号数 A.单符号位补码 【规律通用】不同则溢出 &#xff08;一&#xff09;移位运算 补码右移不会溢出&#xff0c;仅左移时可能溢出 【实操方法】看补码的高2位直接出结果&#xff1a;若高2位数&#xff08;即符号位和最高数位&a…

从 Language Model 到 Chat Application:对话接口的设计与实现

作者&#xff1a;网隐 RTP-LLM 是阿里巴巴大模型预测团队开发的大模型推理加速引擎&#xff0c;作为一个高性能的大模型推理解决方案&#xff0c;它已被广泛应用于阿里内部。本文从对话接口的设计出发&#xff0c;介绍了业界常见方案&#xff0c;并分享了 RTP-LLM 团队在此场景…

bug_java

文章目录 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本52. Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本…

golang中go build 后读取配置文件

golang打包后读取配置文件 在用go写代码的时候&#xff0c;为了好用经常使用go build 打包&#xff0c;如果我们用到了配置文件&#xff0c;就总是导致不能找到文件所在位置了出现bug&#xff0c;所以以下代码就解决了这个问题。 核心代码&#xff1a; file, err : exec.Look…

Android使用Sensor.TYPE_STEP_COUNTER计步器传感器进行步数统计

1、首先&#xff0c;申请权限 必须声明 ACTIVITY_RECOGNITION 权限&#xff0c;以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。 Manifest.xml也记得声明 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {Log.d(TAG, "[权限]&quo…

Nodejs 第五十章(lua的基本使用)

lua基本使用 全局变量局部变量 全局变量是在全局作用域中定义的变量&#xff0c;可以在脚本的任何地方访问。全局变量在定义时不需要使用关键字&#xff0c;直接赋值即可。 xiaoman xmzsprint(xiaoman)局部变量是在特定作用域内定义的变量&#xff0c;只能在其所属的作用域…