三阶段复习

 6.21 静态库与动态库

库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。静态库在链接期把整个库文件都拷贝到可执行文件中,而动态库在链接期只是把索引文件拷贝到可执行文件中,在运行时才调用动态库。(通过索引文件找到动态库文件)

静态库与动态库优缺点

静态库:

优点:由于静态库是将整个库文件都拷贝到可执行文件中,所以调用速度相对快。

缺点:1.浪费内存空间(多个应用程序依赖同一个静态库时,多个程序运行时,会在内存中拷贝多份静态库)2.对程序的更新、部署、发布比较麻烦,静态库修改后,需要重新编译整个可执行文件,重新安装。

动态库:

优点:1.节省内存空间(多个应用程序依赖同一个动态库时,多个程序运行时,只会在内存中拷贝一份动态库)2.对程序的更新、部署、发布简单,动态库修改后,只需要重新编译动态库即可,不需要重新编译整个可执行文件。

缺点:调用速度比静态库慢,移植的时候需要同时移植可执行文件和动态库。

 6.22 网络基本模型

七层网络模型

应用层

用来提供应用程序之间的信息通信的(例:淘宝、qq、微信等)

涉及到的协议(protocol):

HTTP

超文本传输协议,TCP端口 80

HTTPS

超文本传输安全协议,TCP端口 443,相比HTTP多了SSL加密方式,更安全

FTP

File Transfer Protocol,文件传输协议,TCP端口 23

DNS

Domain Name System,域名系统,UDP端口 53,将域名解析成IP地址

DHCP

Dynamic Host Configuration Protocol,动态主机配置协议,UDP端口 68,动态获取网络配置

Telnet

远程终端协议,TCP端口 23,远程控制Web服务器

SMTP

简单邮件传输协议,TCP端口 25,提供可靠且有效的电子邮件传输的协议

SSH

Secure Shell,安全外壳,是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务

表示层

提供数据格式转换的,主要用来数据加解密、数据解压缩。图片/视频编解码。

几个注意点:

数据在发送之前要用一定的加密方法进行加密

想要使数据发送的快,就要对数据进行压缩,这样也会使网络更通畅

实时传输(直播)一般都需要视频编解码,不然延迟会高

会话层

session会话管理、服务器验证用户登录、断点续传。

session会话管理 例:如果我们在登录一个网站之后,浏览页面过程中要跳转网页,那么不需要重复登录,靠的就是session会话管理,它保证了用户在同一个网站中不管多少次的页面跳转,都不需要重新登录

断点续传 例:在下载文件中途有网络波动,在一段时间内网络恢复了,那么会接着下载

传输层

(操作系统级别的)

TCP

TCP,传输控制协议,提供一种面向连接的、可靠的、基于字节流的传输层通信协议,有流量控制和差错控制,使用TCP协议的应用比如邮件的接收和发送、文件传输、远端登录。需要数据稳定和完整性比较高的场景多使用TCP协议。

UDP

UDP,用户数据报协议,提供一种无连接的、高效率、低可靠性的数据传输服务,使用UDP协议的应用比如音视频聊天、在线游戏王者荣耀等、工业物联网数据传输等。需要数据时效性比较高的场景多使用UDP协议。

线程
端口

注:一个应用程序可以使用多个端口,但是一个端口只能被一个应用程序使用

socket(套接字)

是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

其中TCP/IP协议不是TCP和IP协议,而是代表一个协议族

数据传输一定需要的两个信息:

IP地址和端口号,IP地址能够保证数据到达目标设备,端口号保证数据能从设备到应用程序

网络层

网络层不止有协议,还有实际的设备,比如路由器

协议有IP、ARP、RARP、防火墙

网络层主要做的是寻址和路由选择

可以通过ipconfig查看自己的ip地址

数据链路层

交换机、网卡(MAC地址)

设备有几个网卡,就有几个ip地址

交换机只能进行单纯的转发,大家要连到同一台交换机上,而路由器除了支持数据转发外还支持路由寻址

物理层

光纤、网线

把数字信号转换为电信号或光信号进行比特流传输

TCP/IP事实标准网络模型

包含应用层、传输层、网络层、物理层

C/S架构与B/S架构对比

C/S(Client/Server)

客户端和服务端可以使用任意协议(常用TCP、UDP)连接
需要指定客户端,每个应用程序都有指定的客户端 

B/S(Browser/Server)

客户端不受限制
浏览器和服务端必须使用 http 或 https 协议

实战训练:C/S架构

基于UDP

服务端代码

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
using namespace std;
#include<WinSock2.h>

#pragma comment(lib,"Ws2_32.lib")

int main()
{
	//加载库
	WORD wVersion = MAKEWORD(2, 2);/*创建版本号 2.2 版本*/
	WSAData data;
	int err = WSAStartup(wVersion,&data);
	if (0 != err)
	{
		printf("WSAStartup failed with error: %d\n", err);
		return 1;
	}
	if (2 != LOBYTE(data.wVersion) || 2 != HIBYTE(data.wVersion))/*判断加载的版本号是否正确*/
	{
		printf("Could not find a usable version of Winsock.dll\n");
		WSACleanup();
		return 1;
	}
	else
		printf("The Winsock 2.2 dll was found okay\n");
	//创建套接字
	SOCKET sock = socket(AF_INET/*IPV4版本*/, SOCK_DGRAM/*UDP报文段*/, IPPROTO_UDP/*协议类型为UDP*/);
	if (INVALID_SOCKET == sock)
	{
		printf("sock failed with error: %d\n",WSAGetLastError());
		WSACleanup();
		return 1;
	}
	else
		printf("sock success\n");

	//绑定ip和端口号
	/*这里相当于初始化结构体*/
	struct sockaddr_in addrServer;
	addrServer.sin_family = AF_INET;/*IPV4类型*/
	addrServer.sin_addr.S_un.S_addr = INADDR_ANY;/*任意网卡*/
	addrServer.sin_port = htons(12345);/*htons 转换成网络字节序*/
	/*这里是绑定*/
	err = bind(sock,(sockaddr*)&addrServer,sizeof(addrServer));
	if (SOCKET_ERROR == err)
	{
		printf("bind failed with error: %d\n", WSAGetLastError());
		//关闭套接字
		closesocket(sock);
		//卸载库
		WSACleanup();
		return 1;
	}
	else
		printf("bind success\n");

	//收发数据
	int recvNum = 0;
	char recvBuf[1024] = "";
	int sendNum = 0;
	char sendBuf[1024] = "";

	struct sockaddr_in addrClient;
	int addrClientSize = sizeof(addrClient);
	while (true)
	{
		//接收消息
		recvNum = recvfrom(sock, recvBuf, sizeof(recvBuf), 0, (sockaddr*)&addrClient, &addrClientSize);
		if (recvNum > 0)
		{
			//打印收到的数据
			char ip[100] = "";
			cout << "ip:" << inet_ntoa(addrClient.sin_addr) << ":" << recvBuf << endl;
			/*inet_addr 将点分十进制ip地址转换为ulong类型,inet_ntoa 将ulong类型转换为点分十进制*/
		}
		else if (recvNum == 0)
		{
			cout << "connect closed,please try again..." << endl;
		}
		else
			break;

		//发送消息
		gets_s(sendBuf);//读取数据
		/*sendto 给谁发信息就绑定谁的地址信息*/
		sendNum = sendto(sock,sendBuf, sizeof(recvBuf), 0, (sockaddr*)&addrClient, addrClientSize);
		if (SOCKET_ERROR == sendNum)
		{
			cout << "send error" << endl;
			break;
		}
	}

	//关闭套接字
	closesocket(sock);
	//卸载库
	WSACleanup();

	return 0;
}

 客户端代码

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
using namespace std;
#include<WinSock2.h>

#pragma comment(lib,"Ws2_32.lib")

int main()
{
	//加载库
	WORD wVersion = MAKEWORD(2, 2);/*创建版本号 2.2 版本*/
	WSAData data;
	int err = WSAStartup(wVersion, &data);
	if (0 != err)
	{
		printf("WSAStartup failed with error: %d\n", err);
		return 1;
	}
	if (2 != LOBYTE(data.wVersion) || 2 != HIBYTE(data.wVersion))/*判断加载的版本号是否正确*/
	{
		printf("Could not find a usable version of Winsock.dll\n");
		WSACleanup();
		return 1;
	}
	else
		printf("The Winsock 2.2 dll was found okay\n");
	//创建套接字
	SOCKET sock = socket(AF_INET/*IPV4版本*/, SOCK_DGRAM/*UDP报文段*/, IPPROTO_UDP/*协议类型为UDP*/);
	if (INVALID_SOCKET == sock)
	{
		printf("sock failed with error: %d\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}
	else
		printf("sock success\n");


	//接收端的地址信息
	struct sockaddr_in addrServer;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(12345);  //htons转换成网络字节序
	addrServer.sin_addr.S_un.S_addr = inet_addr("192.168.246.1");

	//收发数据
	int recvNum = 0;
	char recvBuf[1024] = "";
	int sendNum = 0;
	char sendBuf[1024] = "";

	while (true)
	{
		//发送消息
		gets_s(sendBuf);//读取数据
		sendNum = sendto(sock, sendBuf, sizeof(recvBuf), 0, (sockaddr*)&addrServer, sizeof(addrServer));
		if (SOCKET_ERROR == sendNum)
		{
			cout << "send error" << endl;
			break;
		}

		//接收消息
		recvNum = recvfrom(sock, recvBuf, sizeof(recvBuf), 0, NULL/*传出参数,后续用不上addrServer了,所以可以传NULL,后面的NULL同理*/, NULL);
		if (recvNum > 0)
		{
			//打印收到的数据
			cout << "server say:" << recvBuf << endl;
		}
		else if (recvNum == 0)
		{
			cout << "connect closed,please try again..." << endl;
		}
		else
			break;
	}

	//关闭套接字
	closesocket(sock);
	//卸载库
	WSACleanup();

	return 0;
}

 运行结果

可见,服务端和客户端可以实现一来一回收发数据。

常见报错原因

无法解析的外部符号:没有添加依赖库

未定义标识符:没有头文件

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

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

相关文章

【漏洞复现】畅捷通T+ keyEdit.aspx SQL漏洞

0x01 产品简介 畅捷通 T 是一款灵动&#xff0c;智慧&#xff0c;时尚的基于互联网时代开发的管理软件&#xff0c;主要针对中小型工贸与商贸企业&#xff0c;尤其适合有异地多组织机构(多工厂&#xff0c;多仓库&#xff0c;多办事处&#xff0c;多经销商)的企业&#xff0c;…

预制直埋聚氨酯保温管

&#x1f600;宝子们&#xff0c;今天来给大家介绍一下预制聚氨酯直埋保温管&#x1f389;&#xff01; 它可是个好东西&#x1f44d;&#xff0c;具有超强的保温性能&#x1f9ca;&#xff0c;能够有效保持管道内的温度&#x1f60e;。 而且它还很耐用&#x1f4aa;&#xff0…

【华为HCIA数通网络工程师真题-构建互联互通的IP网络】

文章目录 一、选择题 一、选择题 1、缺省情况下&#xff0c;广播网络上OSPF协议RouterDeadInterval是&#xff1f; 40s &#xff08;ospf 的 RouterDeadInterval 为四倍 hello time 时间&#xff0c;hello time 周期默认为10s&#xff0c;所以 RouterDeadInterval 默认为 40s …

JimuReport 积木报表 v1.7.6 版本发布,免费的低代码报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

Linux安装Maven(详细教程手把手教会)

安装Maven 1.下载压缩包 官网下载&#xff1a;https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz 2.上传到Linux服务器的opt目录下 3.执行命令解压 tar -zxvf apache-maven-3.8.8-bin.tar.gz4.添加环境变量 vim /etc/profile5.在最后…

通过 cloudflare 白嫖个人 docker 镜像加速服务

不知为何&#xff0c;现在大多数的 docker hub 镜像加速站都停止服务&#xff0c;而官方站点又因某些原因访问不到或延迟很高。所以&#xff0c;今天来记录一种通过 CloudFlare 搭建一个自己的镜像加速服务。 0、必看&#xff01;&#xff01;&#xff01; 注意&#xff1a; 此…

JavaSE基础总结复习之面向对象の知识总结

目录 Java语言的基础特点 面向对象 类和对象 类 类的构造 一&#xff0c;发现类 二&#xff0c;发现类的共有属性&#xff08;成员变量&#xff09; 三&#xff0c;定义类的成员方法&#xff08;行为&#xff0c;动词&#xff09; 四&#xff0c;使用类创建对象 对象…

194.回溯算法:组合总和||(力扣)

代码解决 class Solution { public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtracing(vector<int>& candidates, int target, int flag, int index, vector<bool>…

Azure虚拟机

Azure创建虚拟机 一、创建步骤(1)登录到Azure portal(2)启动新实例(3)填写必要信息选择系统镜像(4)选择实例类型(5)配置管理员帐户和入站端口规则(6) 磁盘&#xff1a;保持默认(7) 网络&#xff1a;保持默认(8) 管理&#xff1a;保持默认(9) Monitoring&#xff1a;Boot diagno…

Django之云存储(二)

一、Django使用云存储 建立项目 django-admin startproject project_demo创建子应用 python manage.py startapp app_name修改配置文件,设置模板视图路径 settings.py TEMPLATES = [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR,…

nn.Embedding 根据索引生成的向量有权重吗

import torch import torch.nn as nn 假设有一个大小为 10x3 的 Embedding 层&#xff0c;其中有 10 个单词&#xff0c;每个单词用一个长度为 3 的向量表示 num_words 10 embedding_dim 3 创建 Embedding 层 embedding_layer nn.Embedding(num_words, embedding_dim) p…

【LinuxC语言】深入理解IP地址与端口号

文章目录 前言端口号IP地址IP地址的分类主机地址与网络地址多播是什么子网掩码特殊的地址与私有的地址总结前言 在计算机网络中,IP 地址和端口号是两个非常重要的概念。IP 地址用于标识网络上的设备,而端口号则用于在同一设备上区分不同的服务或应用。在 Linux C 语言编程中…

腾讯云API安全保障措施?有哪些调用限制?

腾讯云API的调用效率如何优化&#xff1f;怎么使用API接口发信&#xff1f; 腾讯云API作为腾讯云提供的核心服务之一&#xff0c;广泛应用于各行各业。然而&#xff0c;随着API应用的普及&#xff0c;API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…

尚品汇-(五)

商品管理模块开发 下面用到的表&#xff1a; 属性表&#xff1a; 属性值表&#xff1a; 分类一表&#xff1a; 分类二表&#xff1a; 分类三表&#xff1a; 1.1在service 模块下搭建service-product 搭建过程同common-util 添加配置文件application.yml spring:applicatio…

Leetcode 2713. 矩阵中严格递增的单元格数(DFS DP)

Leetcode 2713. 矩阵中严格递增的单元格数 DFS 容易想到&#xff0c;枚举每个点作为起点&#xff0c;向同行同列的可跳跃点dfs&#xff0c;维护全局变量记录可达的最远距离 超时&#xff0c;通过样例193 / 566 class Solution {int res 0;public void dfs(int[][] mat, in…

opencv中凸包运算函数convexHull()的使用

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 该函数cv::convexHull用于寻找一组二维点集的凸包&#xff0c;采用的是Sklansky算法[242]&#xff0c;当前实现中具有O(N logN)的时间复杂度。 1…

SuiNS发布子名及新命名标准,推动Web3身份结构的进步

SuiNS子名是Sui Name Service的强大扩展&#xff0c;最近与新命名标准一起发布。子名允许用户在一个主要的SuiNS名下创建额外的自定义身份&#xff0c;而无需额外费用。用户 gia 可以创建如 gaminggia 或 lendinggia 这样的子名&#xff0c;从而增强个人组织和支持群组与组织的…

机器人学习和研究的物质基础包含哪些内容?

为啥写这个&#xff1f; 在很多博客里面提及物质基础&#xff0c;没想到询问的也非常多&#xff0c;写一篇详细一点的。 之前的故事 不合格且失败机器人讲师个人理解的自身课程成本情况-CSDN博客 迷失自我无缘多彩世界-2024--CSDN博客 物质基础与情绪稳定的关系-CSDN博客 …

docker搭建mongo分片集群

1、mongo分片集群 MongoDB分片集群是一种可扩展的数据库架构&#xff0c;用于处理大量数据和高并发访问。它将数据分成多个分片&#xff0c;并将这些分片分布在多个服务器上&#xff0c;从而实现数据的平衡存储和并行处理 。 通过使用MongoDB的分片集&#xff0c;可以实现数据…

ViT:5 Knowledge Distillation

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…