C++linux高并发服务器项目实践 day12

news2024/9/22 15:44:25

C++linux高并发服务器项目实践 day12

  • socket介绍
    • 字节序
    • 字节序转换函数
  • socket地址
  • IP地址转换(字符串ip-整数,主机、网络字节序的转换)
  • TCP通信流程
  • 套接字函数
  • TCP三次握手
  • TCP滑动窗口
  • TCP四次挥手

socket介绍

socket是网络环境中进程间通信的API,也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。通信时其中一个网络应用进程将要传输的一段信息写入它所在主机的socket中,该socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的socket中,使对方能够接收到这段信息。socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制

socket与管道的区别在于,管道只能实现文件间通信,socket可以实现进程间通信
在这里插入图片描述

字节序

字节序就是大于一个字节类型的数据在内存中的存放顺序
字节序分为大端字节序和小端字节序。大端字节序是指一个整数的最高位字节(23~31bit)存储在内存的低地址处,低位地址(0-7bit)存储在内存的高地址处;小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处
在这里插入图片描述
查看字节序:

union 
{
    short value;                //2字节
    char bytes[sizeof(short)];  //2字节
}test;

test.value = 0x0102;
if((test.bytes[0]== 1)&&(test.bytes[1] == 2)){
    printf("大端字节序");
}else if((test.bytes[0]== 2)&&(test.bytes[1] == 1)){
    printf("小端字节序");
}else{
    printf("未知字节序");
}
    

字节序转换函数

当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误的理解之。解决问题的方法是:发送端总是把要发送的数据转换成大端字节序数据后再发送,而接收端知道对方传送过来的数据总是采用大端字节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换).

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用大端排序方式。

BSD Socket提供了封装好的转换接口,方便程序员使用。有以下函数供使用htons(转换端口)、htonl、ntohs(转换IP)、ntohl。逐词意思如下
h - host
to - to
n - network
l - long
s - short

#include <stdio.h>
#include <arpa/inet.h>


    //htons
    unsigned short a = 0x0102;
    printf("a : %x\n",a);
    unsigned short b = htons(a);
    printf("b : %x\n",b);

    printf("===========================\n");

    //htonl 转换IP
    char buf[4] = {192,168,1,100};
    int num = *(int *)buf;
    int sum = htonl(num);
    unsigned char *p = (char *)&sum;

    printf("%d %d %d %d\n",*p ,*(p+1),*(p+2),*(p+3));

    printf("===========================\n");

    //ntohs
    unsigned short c = 0x0102;
    printf("c : %x\n",c);
    unsigned short d = ntohs(c);
    printf("d : %x\n",d);

    printf("===========================\n");

    //ntohl
    unsigned char buf2[4] = {1,1,168,192};
    int num2 = *(int *)buf2;
    int sum2 = ntohl(num2);
    unsigned char *p2 = (unsigned char *)&sum2;
    printf("%d, %d, %d, %d\n",*p2 ,*(p2+1),*(p2+2),*(p2+3));


socket地址

socket网络编程接口中表示socket地址的是结构体sockaddr,其定义如下:

#include <bits/socket.h>
struct sockaddr{
	sa_family_t sa_family;
	char sa_data[14];
};

typedef unsigned short int sa_family_t;

sa_family成员是地址组类型(sa_family_t)的变量。地址族类型通常与协议族类型对应。
在这里插入图片描述
宏PF_*和AF_*都定义在bits/socket.h头文件中,且后者与前者有完全相同的值,所以二者通常混用。sa_data成员用于存放socket地址值,但是,不同协议族的地址值具有不同的含义和长度。
在这里插入图片描述
用于14字节的sa_data根本无法容纳多数协议族的地址值。因此,Linux定义了下面这个新的通用的socket地址结构体,这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的。

#include <bits/socket.h>
struct sockaddr_storage
{
	sa_family_t sa_family;
	unsigned long int __ss_align;
	char __ss_padding[128 - sizeof(__ss_align)];
};

typedef unsigned short int sa_family_t;

现在的sockaddr退化成了(void*)的作用,传递一个地址给函数,由地址族确定函数是什么,然后函数内部在强制类型转化为所需的地址类型
在这里插入图片描述
所有专用socket地址(以及sockaddr_storage)类型的变量在实际使用时都需要转化为通用socket地址类型sockaddr(强制转化即可),因为所有socket编程接口使用的地址参数类型都是sockaddr。

IP地址转换(字符串ip-整数,主机、网络字节序的转换)

下面3个函数可用于用点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间的转换:

#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp,struct in_addr *inp);
char *inet_ntoa(struct in_addr in);

下面这对更新的函数也能完成同样的功能,且他们同时适用于ipv4和ipv6地址

#include<arpa/inet.h>
//p:点分十进制的IP字符串,n:表示network,网络字节序的整数
int inet_pton(int af,const char *src ,void *dst);
	af:地址族:AF_INET AF_INET6
	src:需要转换的点分十进制的IP字符串
	dst:转换后的结果保存在这个里面


//将网络字节序的整数,转换成点分十进制的IP字符串
const char *inet_ntop(int af,const void *src,char * dst,socklen_t size);
	af:地址族:AF_INET AF_INET6
	src:要转换的IP的整数的地址
	dst:转换成IP地址字符串保存的地方
	size:第三个参数的大小
	返回值:返回转换后的数据的地址(字符串),和dst是一样的

TCP通信流程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

套接字函数

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>//包含了这个头文件,上面两个就可以省略

int socket(int domain, int type ,int protocol);
	- 功能:创建一个套接字
	- 参数:
		- domain:协议族
			AF_INET		:ipv4
			AF_INET6	:ipv6
			AF_UNIX,AF_LOCAL	:本地套接字通信(进程间通信)
		- type:通信过程中使用的协议类型
			SOCK_STREAM	:流式协议
			SOCK_DGRAM	:报式协议
		- protocol:具体的一个协议。一般写0
			-SOCK_STREAM : 流式协议默认使用TCP
			-SOCK_DGRAM  : 报式协议默认使用UDP
		- 返回值:
			- 成功:返回文件描述符,操作的就是内核缓冲区
			- 失败:-1

int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);//socket命名
	- 功能:绑定,将fd和本地的IP+端口进行绑定
	- 参数:
		- sockfd : 通过socket函数得到的文件描述符
		- addr :需要绑定的socket地址,这个地址封装了ip和端口号的信息
		- addrlen : 第二个参数结构体占的大小

int listen (int sockfd,int backlog);/proc/sys/net/core/somaxconn,可以使用cat命令查看该目录
	- 功能:监听这个socket上的连接
	- 参数:
		- sockfd : 通过socket()函数得到的文件描述符
		- backlog : 未连接和已连接的连接数的上限,超过时会丢失

int accept(int sockfd,struct sockaddr *addr ,socklen_t *addrlen);
	- 功能:接收客户端连接,默认是一个阻塞的函数,阻塞等待客户端连接
	- 参数:
		- sockfd : 用于监听的文件描述符
		- addr : 传出参数,记录了连接成功后客户端的地址信息(ip,port)
		- addrlen : 指定第二个参数的对应的内存大小
	- 返回值:
		- 成功 : 用于通信的文件描述符
		- 失败 : -1
		
int connect(int sockfd,const struct sockaddr * addr,socklen_t addrlen);
	- 功能 : 客户端连接服务器
	- 参数 : 
		- sockfd : 用于通信的文件描述符
		- addr : 客户端要连接的服务器的地址信息
		- addrlen : 第二个参数对应的内存大小
	- 返回值: 成功 0,失败 -1

ssize_t write(int fd,const void *buf,size_t count);
ssize_t read(int fd,void * buf ,size_t count);

TCP三次握手

在这里插入图片描述
默认已经学过了

TCP滑动窗口

滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方再接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能发送多少包(称为窗口尺寸)
TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报

滑动窗口是TCP中实现诸如ACK确认、流量控制、拥塞控制的承载结构。
可以把窗口理解为缓冲区的大小

滑动窗口的大小会随着发送数据和接收数据而变化
通信的双方都有发送缓冲区和接收数据的缓冲区

MSS:Maximum Segment Size(一条数据的最大数据量)
win:滑动窗口

TCP四次挥手

在这里插入图片描述
默认已经学过了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAPL如何仿真ARP报文

文章目录 前言一、环境搭建二、IG生成器仿真ARP报文三、CAPL仿真ARP报文前言 随着智能电动汽车的普及,车载以太网的应用逐渐广泛,所以在汽车电子台架测试过程中,免不了仿真模拟发送以太网报文,本文就介绍两种方法模拟仿真发送以太网ARP报文。 一、环境搭建 CANoe安装 VN5…

FPGA时序约束--实战篇(Vivado添加时序约束)

前面几篇文章已经详细介绍了FPGA时序约束基础知识以及常用的时序约束命令&#xff0c;相信大家已经基本掌握了时序约束的方法。 今天介绍一下&#xff0c;如何在Vivado中添加时序约束&#xff0c;Vivado添加约束的方法有3种&#xff1a;xdc文件、时序约束向导&#xff08;Cons…

vue基础-全选,使用计算属性 和 every遍历数组的返回值 true or false

购物车--计算购物车价格 1、计算属性--只要被依赖的数据 发生变化&#xff0c;结果就会变化 2、全选实现 根据选项&#xff0c;动态计算出布尔值&#xff0c;通过计算属性 得到布尔值&#xff1a; 通过every遍历数组list&#xff0c;只要所有 都满足 item > item.goods_s…

递推算法介绍

递推算法 给定一个数的序列H0,H1,…,Hn,…若存在整数n0&#xff0c;使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来&#xff0c;这样的式子就叫做递推关系。 递推算法是一种简单的算法&#xff0c;即通过已知条件&#xff0c;利用特…

CVPR 2023|EfficientViT:让ViT更高效部署实现实时推理(附源码)

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2305.07027.pdf 项目代码&#xff1a;https://github.com/microsoft/Cream/tree/main…

打通B端企业私域运营体系:海康威视企业公众号矩阵一探究竟

B端企业私域运营体系的打造需要全新的思路和流程重构&#xff0c;要紧紧围绕B端客户的需求和特性来构建矩阵号&#xff0c;而且要时刻意识到与C端私域运营的巨大差异。 B端企业的获客是一个大部分企业都十分关注但难以提升的部分&#xff0c;传统B端企业的营销以百度等在线渠道…

candence:常见表贴焊盘绘制举例

常见表贴焊盘绘制举例 一、先来看看X7R电容的相关信息 以贴装瓷片电容X7R系列为例 1、误差范围&#xff1a; 2、尺寸大小 3、推荐焊盘尺寸 二、绘制 0603 (inch) 电容的焊盘 下面开始绘制焊盘&#xff1a; 1、 双击打开Pad Designer 2、设置单位等。 3、 点击"LAYER&…

GeSciLiVis | 想知道你感兴趣的基因有多少人在研究吗!?用这个包来解决吧!!!~

1写在前面 天气好热啊&#xff0c;我这里还下着大暴雨&#xff01;~&#x1f625; 不知道各位小伙伴那里的温度怎么样&#xff0c;端午临近&#xff0c;各位有假期吗&#xff01;&#xff1f;&#x1f618; 换组后工作轻松了不少&#xff0c;也有时间做点自己的事情了。&#x…

JDK8-2-流(2.1)- 流操作-distinct

JDK8-2-流&#xff08;2.1&#xff09;- 流操作-distinct 去重操作&#xff0c;如下开头两个菜品一样&#xff0c;对 menu 去重如下&#xff1a; public class DishDistinctTest1 {public static final List<Dish> menu Arrays.asList(new Dish("pork", fal…

如何白嫖一年CSDN会员?618活动!亲测有效!!!

活动详情 CSDN会员免费送一年&#xff0c;仅剩3天&#xff01; 下载权益同样延长一年&#xff01; 一年一次的机会&#xff0c;走过不要错过&#xff01; 博主已经领取到了&#xff01; 会员权益 1、修改专属域名&#xff0c;别人都是https://blog.csdn.net/qq_xxxxxxxx&…

用ipad2022款pro平板和平精英吃鸡120帧是种什么体验

用ipad2022款pro平板和平精英吃鸡120帧是种什么体验&#xff0c;平板玩游戏把把吃鸡的秘密#和平精英 #吃鸡 #我眼中的电子竞技 和平精英 微信游戏 怎么很多小伙伴都准备入手二款的 iPad Pro&#xff0c;绝大多数小伙伴都是冲着这个吃鸡来的&#xff0c;咱们今天就看一下新款平…

AI绘图新玩法「艺术风二维码」保姆级教程分享,注册账号就能玩,一分钟出图,定制自己的二维码!

大家好&#xff0c;我是卷了又没卷&#xff0c;薛定谔的卷的AI算法工程师「陈城南」~ 担任某大厂的算法工程师&#xff0c;带来最新的前沿AI知识和工具&#xff0c;包括AI相关技术、ChatGPT、AI绘图等&#xff0c;欢迎大家交流~。 最近AI绘图界又出了一个现象级的玩法&#xf…

FPGA基础知识-开关级建模

目录 学习目标 学习内容 1.MOS开关 2.CMOS开关 3.双向开关 4.电源和地 5.阻抗开关 6.开关中的延迟说明 学习时间 学习总结 学习目标&#xff1a; 提示&#xff1a;这里可以添加学习目标 1.能够描述基本 MOS开关:nmos.pmos和cmos。 2.理解双向传输开关、电源和地的建…

webpack配置preload和prefetch预加载技术

我们前面已经做了代码分割&#xff0c;同时会使用 import 动态导入语法来进行代码按需加载&#xff08;我们也叫懒加载&#xff0c;比如路由懒加载就是这样实现的&#xff09;。 但是加载速度还不够好&#xff0c;比如&#xff1a;是用户点击按钮时才加载这个资源的&#xff0…

【第二次】21级计科计算机组成原理课外练习

【第二次】21级计科计算机组成原理课外练习 一、单选题二、填空题 一、单选题 2-1 设计算机字长 8位&#xff0c;设x -10, [x]补 为 ( ) A.F0H B.E6H C.FAH D.F6H 2-2 对字长为8位的二进制代码10110110&#xff0c;下列说法错误的是&#xff08;&#xff09;。 A.如果代码为…

主流通信协议详解、二进制协议和文本协议的区别和使用场景

二进制协议和文本协议的特征和使用场景 二进制协议和文本协议具有不同的特征和适用场景&#xff1a; 二进制协议的特征&#xff1a; 数据表示&#xff1a;使用二进制编码来表示数据&#xff0c;以字节为单位进行传输。效率&#xff1a;由于数据以原始二进制形式传输&#xff…

年龄越来越大,技术人究竟该往哪个方向提升?(很多人都有这个困惑)

【1】 有位匿名朋友&#xff0c;在星球中提问&#xff1a; 想咨询一下沟通交流能力应该如何培养。平时遇到问题话到嘴边不会说&#xff0c;或者说出来的和开始想的不一致&#xff0c;请沈总赐教。 分享下自己的实践&#xff1a; 首先&#xff0c;充分准备。 我在和老板&#xf…

Linux ACL访问控制

文章目录 1、场景2、ACL权限设置1) ACL权限管理命令2) 给用户和用户组添加ACL权限3) 最大有效权限mask4) 默认ACL权限和递归ACL权限5) 删除ACL权限 1、场景 在普通权限中&#xff0c;用户对文件只有三种身份&#xff0c;就是属主、属组和其他人&#xff1b;每种用户身份拥有读…

实验篇(7.2) 14. 站对站安全隧道 - 多条隧道冗余(FortiGate-IPsec) ❀ 远程访问

【简介】IPsec VPN虽然价廉物美&#xff0c;但是由运营商原因&#xff0c;偶尔出现不稳定情况&#xff0c;例如访问慢甚至断开等&#xff0c;好在现在大多数企业都有二条甚至更多条宽带&#xff0c;我们可以创建多条IPsec VPN&#xff0c;来保证不间断访问。 实验要求与环境 Ol…

线性搜索算法-数据结构和算法教程

线性搜索被定义为一种顺序搜索算法&#xff0c;它从一端开始&#xff0c;遍历列表的每个元素&#xff0c;直到找到所需的元素&#xff0c;否则搜索继续到数据集的末尾。 线性搜索算法是如何工作的&#xff1f; 在线性搜索算法中&#xff0c; 每个元素都被认为是键的潜在匹配…