linux高级编程(OSI/UDP(用户数据报))

OSI七层模型:

OSI 模型  --> 开放系统互联模型  --> 分为7层:
       理想模型  --> 尚未实现

        1.应用层  QQ
                       应用程序的接口
        2.表示层  加密解密  gzip
                       将接收的数据进行解释(机器->人)
        3.会话层  网络断开,连接状态,keep-close keep-alive
                       通信双方管理会话
        4.传输层:tcp  udp  协议  文件    视频,音频
                        (传数据)
        5.网络层ip   NAT
            实现数据从源经过多条链路到目的地的转发(找主机)
        6.链路层  交换机  数据的格式化  帧 校验
                    将电信号封装,建立数据链路,实现点对点数据传输
        7.物理层:100Mb/8  Gbits   100MB 同轴电缆 10Gb    2.4G 5G
                     可通过物理介质传播的电信号

TCP/IP模型:

  TCP/IP模型  --> 网际互联模型   --> 分为4层:
      实用模型  --> 工业标准

        1.应用层  --->  应用程序(用户与应用程序的接口)(会话层+表示层+应用层)
        2.传输层  --->  端口号tcp udp  (传数据)
        3.网络层  --->  IP 地址(找主机)
        4.接口层  --->  网卡 驱动  1GB(连结互联网的基础设施)(物理层+链路层)

网络基础

IP地址 = 网络位 + 主机位
010 3333344444

IP地址的分类: 点分十进制   ipv4(4字节(32位)数据,42亿个地址,已耗尽) 
                 ipv6(16字节(128位)数据,地址很多,未耗尽

A类:    超大规模性网络
                    8    8    8    8
        1.0.0.0 - 126.255.255.255  126.1.1.1 
                                    126.1.1.2
        255.0.0.0    
        私有:
        10.0.0.0 - 10.255.255.255
        127.0.0.1
    B类:    大中规模型网络
        128.0.0.0 - 191.255.255.255
        128.2.1.2  128.2.7.2
        255.255.0.0
        私有:
        172.16.0.0 - 172.31.255.255

    C类:    中小规模型网络
        192.0.0.0 - 223.255.255.255
        255.255.255.0
        私有:
        192.168.0.0 - 192.168.255.255
        静态路由
        192.168.0.0
        192.168.0.1  网关
        192.168.0.255 

    D类:    组播和广播(广播:所有用户都能传播,组播:某个小范围组内能传播)

             (无子网掩码)
        224.0.0.0 - 239.255.255.255
        192.168.0.255 ==  255.255.255.255
        235.1.2.3
        192.168.1.0 
        192.168.0.1   网关
        192.168.1.255 广播 

    E类:    实验

            (无子网掩码)
        240.0.0.0 - 255.255.255.255

子网掩码:1代表网络部分,0代表主机部分

C 类网络:
     ip地址的前三组是网络地址,第四组是主机地址。
    二进制的最高位必须是: 110xxxxx开头
    十进制表示范围: 192.0.0.0 -223.255.255.255
    默认网络掩码:   255.255.255.0
    网络个数: 2^24 个 约 209 万个
    主机个数: 2^8  个 254 个+2 --> 1个是网关(网络地址.0 的下一个地址.1)                                                                                        另1个是广播(.255最后一个地址)
    私有地址: 192.168.x.x 局域网地址。

网络接口(端口+ip --> 找到进程+找到主机)

1、socket  套接字 --> BSD socket --> 用于网络通信的一组接口函数。socket api  application interface --> 进程到进程 --> 实现主机到主机通信

2、ip+port 地址+端口 --> 地址用来识别主机
                             端口用来识别应用程序

          port分为TCP port / UDP port  范围都是: 1-65535(2^16,两个byte)
          约定1000 以内的端口为系统使用。

网络字节序

--> 大端排序(高位数据放在高地址处)(高地址:值较大的地址)

--> 主机 --> 小端(高位数据放在低地址处)(从小往大走)

数字转换函数:
    #include <arpa/inet.h>
    主机转网络:uint32_t htonl(uint32_t hostlong);
    ipv4 192.168.0.1 1~65535
                uint16_t htons(uint16_t hostshort);
    网络转主机:host to net long 
                net to host 
                uint32_t ntohl(uint32_t netlong);   //对应16位转换与32位转换
                uint16_t ntohs(uint16_t netshort);

    主机转网络:in_addr_t inet_addr(const char *cp);
        inet_addr("192.168.1.20");
        网络转主机:char *inet_ntoa(struct in_addr in);

字符串转换函数:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    主机转网络:in_addr_t inet_addr(const char *cp);
     cli.sin_addr
    inet_addr("192.168.1.20");
    网络转主机:char *inet_ntoa(struct in_addr in);

收发数据

1、模式  C/S 模式  --> 服务器/客户端模型(client/server)

server:socket()-->bind()--->listen()-->accept()-->recv()-->close() 
           创建套接字-->关联接口地址-->-->收、发-->关闭
client:socket()-->connect()-->send()-->close();
            创建套接字-->连接(客户端可以不需要)-->收、发-->关闭

socket()

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET(协议族) == AF_INET(地址族,IPv4) ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP
              SOCK_RAW     原始套接字  ===》IP
      protocol 协议 --> 0 表示自动适应应用层协议。

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

bind()

2、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 的长度。
返回值:成功  0
             失败  -1;

bind传参要进行强转,在实际使用中,struct sockaddr过于底层,不方便处理,而struct sockaddr_in专门用于IPv4地址,所以一般用struct sockaddr_in来定义

#typedef struct sockaddr * (SA);

struct sockaddr_in ser;
int ret = bind(sockfd,(SA)&ser,sizeof(ser));

一般bind的操作为:

struct sockaddr_in ser,cli;
bzero(&ser,sizeof(ser));
bzero(&cli,sizeof(cli));
// 大小端转化 host to net short 
ser.sin_port = htons(50000);
ser.sin_addr.s_addr = inet_addr("192.168.203.128");
int ret = bind(sockfd,(SA)&ser,sizeof(ser));
if(-1 == ret)
{
    perror("bind");
    exit(1);
}

接收函数/发送函数

  read()/write ()   ///通用文件读写,可以操作套接字。
  recv(,0) /send(,0)      ///TCP 常用套机字读写
  recvfrom()/sendto() ///UDP 常用套接字读写


ssize_t recv(int sockfd, void *buf, size_t len,
             int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
      为len字节的数据到指定的buff内存中。
参数:sockfd  
        如果服务器则是accept的返回值的新fd
        如果客户端则是socket的返回值旧fd
      buff 用来存储数据的本地内存,一般是数组或者
      动态内存。
      len 要获取的数据长度
      flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len
        失败  -1;

close()

5、close()  ===>关闭指定的套接字id;

注意事项:

服务器:

需要先接收客户端的地址(recvfrom),不然无法发送数据

typedef struct sockaddr *(SA);
socklen_t cli=sizeof(cli);
recvfrom(sockfd,buf_r,sizeof(buf_r),0,(SA)&cli,len_cli);

客户端:

需要空发一下让服务器拿到(对于收发先后没有太大要求,recvfrom具有读阻塞的作用)

char buf[128];
sendto(sockfd,buf,sizeof(buf),0,(SA)&ser,sizeof(ser));

客户端recvfrom不需要最后两个参数可以是NULL,因为本来就有父进程的端口号和ip

 recvfrom(sockfd,buf_r,sizeof(buf_r),0,NULL,NULL);

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

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

相关文章

旋转木马案例

旋转木马 如果接口需要的数据格式和原始数据提供的格式有差异 不要去改接口方法 也不要改原始数据 做一层中间件(数据处理函数/方法) <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport…

【机器学习】(基础篇二) —— 监督学习和无监督学习

监督学习和无监督学习 本文介绍机器学习的分类&#xff0c;监督学习和无监督学习 监督学习 监督学习&#xff08;Supervised Learning&#xff09;是机器学习的一个核心分支&#xff0c;大部分的机器学习任务都是由监督学习完成的。 它涉及到使用带有标签的训练数据来训练模…

利用 Python 解析pcap文件

1、问题背景 当面对处理网络数据包分析时&#xff0c;pcap文件作为一个常见的文件格式存储了网络数据包的详细记录&#xff0c;它常常被用来进行网络故障排查或安全分析。为了充分利用这些数据&#xff0c;我们需要对其进行解析并提取出有价值的信息&#xff0c;例如数据包类型…

Why Can’t Robots Click The “I’m Not a Robot” Box On Websites?

Clicking a tiny box tells Google all they need to know about your humanity 你好,我是 Jiabcdefh。 if you’ve browsed the internet for any amount of time, you will likely come across a reCAPTCHA box. These boxes appear when you first enter certain websites…

关于Mars3d的入门

关于Mars3d的入门 一. 创建地球&#xff0c;加载瓦片图层二 矢量图层2.1 常用矢量图层2.1.1 GraphicLayer2.1.2 GeoJsonLayer 2.2 矢量图层的点击事件 三 矢量数据四 事件机制 一. 创建地球&#xff0c;加载瓦片图层 // 1. 创建地球let map new mars3d.Map("mars3dContai…

孕产妇(产科)管理信息系统源码 三甲医院产科电子病历系统成品源代码

孕产妇&#xff08;产科&#xff09;管理信息系统源码 三甲医院产科电子病历系统成品源代码 医院智慧孕产是一种通过信息化手段,实现孕产期宣教、健康服务的院外延伸,对孕产妇健康管理具有重要意义,是医院智慧服务水平和能力的体现。实行涵盖婚前检查、孕期保健、产后康复的一…

极客时间:使用Autogen Builder和本地LLM(Microsoft Phi3模型)在Mac上创建本地AI代理

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C语言之数据在内存中的存储(1),整形与大小端字节序

目录 前言 一、整形数据在内存中的存储 二、大小端字节序 三、大小端字节序的判断 四、字符型数据在内存中的存储 总结 前言 本文主要讲述整型包括字符型是如何在内存中存储的&#xff0c;涉及到大小端字节序这一概念&#xff0c;还有如何判断大小端&#xff0c;希望对大…

python极速入门笔记(三)

1. 函数 #定义函数""" def 函数名&#xff08;参数&#xff09;:...return ** """ def calc_BMI(weight,height):BMIweight/(height**2)if BMI<18.5:category"偏瘦"elif BMI<25:category"正常"elif BMI<30:catego…

红外光气体检测:1.分子振动与红外吸收、检测系统的基本模型和红外敏感元件

分子振动与红外吸收 分子偶极矩的变化频率与分子内原子振动状态有关&#xff1a;μqd&#xff0c;其中μ是偶极矩&#xff0c;q是电荷&#xff0c;d是正负电荷中心距离。 分子在…

怎样优化 PostgreSQL 中对布尔类型数据的查询?

文章目录 一、索引的合理使用1. 常规 B-tree 索引2. 部分索引 二、查询编写技巧1. 避免不必要的类型转换2. 逻辑表达式的优化 三、表结构设计1. 避免过度细分的布尔列2. 规范化与反规范化 四、数据分布与分区1. 数据分布的考虑2. 表分区 五、数据库参数调整1. 相关配置参数2. 定…

深度学习-梯度下降算法-NLP(五)

梯度下降算法 深度学习中梯度下降算法简介找极小值问题数学上求最小值梯度梯度下降算法 找极小值问题在深度学习流程中深度学习整体流程图求解损失函数的目标权重的更新 深度学习中梯度下降算法简介 找极小值问题 引子&#xff1a; 我们训练一个人工智能模型&#xff0c;简单…

记录一次Nginx的使用过程

一、Docker安装配置nginx 1.拉取镜像 docker pull nginx2.创建挂载目录 启动前需要先创建Nginx外部挂载目录文件夹 主要有三个目录 conf&#xff1a;配置文件目录log&#xff1a;日志文件目录html&#xff1a;项目文件目录&#xff08;这里可以存放web文件&#xff09; 创建挂…

【沐风老师】3DMAX建筑体块生成插件BuildingBlocks使用方法详解

BuildingBlocks建筑体块生成插件使用方法详解 听说你还在手动建配景楼&#xff1f;有了BuildingBlocks这个插件&#xff0c;一分钟搞定喔&#xff01; 3DMAX建筑体块生成插件BuildingBlocks&#xff0c;用于快速自定义街道及生成配景楼区块。 【适用版本】 3dMax2019及更高版…

鸿蒙语言基础类库:【@ohos.process (获取进程相关的信息)】

获取进程相关的信息 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

【专项刷题】— 位运算

常见类型介绍&#xff1a; & &#xff1a;有 0 就是 0 | &#xff1a;有 1 就是 1 ^ &#xff1a;相同为 0 &#xff0c;相异为 1 或者 无进位相加给定一个数确定它的二进制位的第x个数是0还是1&#xff1a;将一个数的二进制的第x位改成1&#xff1a;将一个数的二进制的第x…

无人机在交通管理方面的应用与潜力

随着智能化和数字化技术的发展&#xff0c;无人机已经成为智慧交通管理体系中的重要一环。无人机能够搭载各种专业设备&#xff0c;如超清摄像头、红外热成像摄像头、目标跟踪器等&#xff0c;从而完成多任务的数据采集和快速机动的任务执行。这些数据通过无线传输实时回传&…

RxJava学习记录

文章目录 1. 总览1.1 基本原理1.2 导入包和依赖 2. 操作符2.1 创建操作符2.2 转换操作符2.3 组合操作符2.4 功能操作符 1. 总览 1.1 基本原理 参考文献 构建流&#xff1a;每一步操作都会生成一个新的Observable节点(没错&#xff0c;包括ObserveOn和SubscribeOn线程变换操作…

YOLOv10改进 | 主干篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络PE-YOLO中的PENet&#xff0c;PENet通过拉普拉斯金字塔将图像分解成多个分辨率的组件&#xff0c;增强图像细节和低频信息。它包括一个细节处理模块&#xff08;DPM&#xff09;&#xff0c;用于通过上下文分支和边…