三阶段复习

news2025/1/15 7:33:19

 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;
}

 运行结果

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

常见报错原因

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

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

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

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

相关文章

数据结构~~时间、空间复杂度

目录 一、什么是数据结构 什么是算法 算法的复杂度 二、时间复杂度 三、空间复杂度 四、总结 一、什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。 数据结构关注的是数据的逻辑结…

爬虫笔记14——爬取网页数据写入MongoDB数据库,以爱奇艺为例

下载MongoDB数据库 首先&#xff0c;需要下载MongoDB数据库&#xff0c;下载的话比较简单&#xff0c;直接去官网找到想要的版本下载即可&#xff0c;具体安装过程可以看这里。 pycharm下载pymongo库 pip install pymongo然后在在python程序中我们可以这样连接MongoDB数据库…

继电器十大品牌供应商

继电器是常用的元器件之一&#xff0c;如下是优秀供应商。 继电器品牌-中间继电器品牌-安全继电器品牌-固态继电器哪个品牌比较好-Maigoo品牌榜

【html】用html+css模拟Windows右击菜单

效果图&#xff1a; 在这个示例中&#xff0c;我为每个.second-list添加了一个.sub-menu的<div>&#xff0c;它包含了子菜单项。当鼠标悬停在.second-list上时&#xff0c;.sub-menu会显示出来。你可以根据需要调整这个示例以适应你的具体需求。 记住&#xff0c;这只是…

「动态规划」如何解决单词拆分问题?

139. 单词拆分https://leetcode.cn/problems/word-break/description/ 给你一个字符串s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true。注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复…

conda下安装32位版本python

前言&#xff1a;当前主流的系统为64bit系统&#xff0c;conda软件为64bit软件&#xff0c;因此使用conda创建虚拟环境安装python时默认安装的python为64bit版本&#xff0c;但部分研发场景需要调用32bit依赖&#xff0c;只能使用32bit的python&#xff0c;因此需要安装32bit的…

36.远程注入到入口点注入

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 上一…

ViT:5 Knowledge Distillation

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

操作系统实验四:openEuler安装(openEuler配置静态网络、编写C或C++)

目录 一、实验要求 二、具体任务安排 1.安装openEuler &#xff08;1&#xff09;下载openEuler镜像 &#xff08;2&#xff09;使用vmware安装openEuler 2.在openEuler中编写C或者C测试程序 &#xff08;1&#xff09;安装g环境 &#xff08;2&#xff09;开始程序编码…

121.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件读取与发送界面设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

IEEE RAL 具有高运动性能的仿旗鱼机器人协同运动机制研究

水下机器人作为军用侦察、监测及攻击装置备受关注&#xff0c;目前传统水下机器人普遍采用螺旋桨作为推进器&#xff0c;但高噪音、高能耗等问题限制了应用范围。鱼类通过自然选择进化出优异的运动性能&#xff0c;特别是在海洋中游动速度快、机动性强的旗鱼。为了探究快速和高…

湖北民族大学2024年成人高等继续教育招生简章

湖北民族大学&#xff0c;这所承载着深厚文化底蕴和卓越教育理念的学府&#xff0c;在崭新的2024年再次敞开怀抱&#xff0c;热烈欢迎有志于深化学习、提升自我的成人学员们。今年的成人高等继续教育招生&#xff0c;不仅是学校对于终身教育理念的具体实践&#xff0c;更是为广…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【13】压力压测JMeter-性能监控jvisualvm

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【13】压力压测JMeter-性能监控jvisualvm 压力测试概述性能指标 JMeter基本使用添加线程组添加 HTTP 请求添加监听器启动压测&查看分析结果JMeter Address Already in use 错误解决 性…

广东信息工程职业学院2024年成人高等继续教育招生简章

一、学校简介 广东信息工程职业学院位于广东省肇庆市&#xff0c;是一所具有一定办学规模&#xff0c;办学定位和培养目标明确&#xff0c;办学特色和追求鲜明&#xff0c;可持续发展的全日制普通高等学校&#xff0c;学院坚持以人为本&#xff0c;以德育人&#xff0c;以良好…

【总线】AXI4第三课时:握手机制

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

【网络安全的神秘世界】SQL注入漏洞

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 本章知识使用的靶场&#xff1a;DVWA 一、漏洞简介 SQL&#xff1a;结构化查询语言&#xff0c;是一种特殊的编程语言&#…

常用主流sip协议软电话客户端软件有哪些?—— 筑梦之路

Ekiga 官网地址&#xff1a;Ekiga ~ Free Your Speech Ekiga&#xff0c;原名GnomeMeeting&#xff0c;支持Windows和Linux&#xff0c;是一个兼容SIP和H.323的视频会议程序&#xff0c;兼容VoIP&#xff0c;IP电话&#xff0c;通过Ekiga可以与使用任何SIP和H.323软硬件的远程…

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

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

进军韩国5G市场!移远通信5G模组RG500L-EU率先获得KT、LGU+认证

近日&#xff0c;移远通信工规级5G模组RG500L-EU再传喜讯&#xff0c;率先通过了韩国两大运营商KT和LGU的严格认证。​在此之前&#xff0c;该模组已顺利通过KC认证&#xff08;韩国法规认证&#xff09;&#xff0c;此次再获运营商认证表明&#xff0c;RG500L-EU已完全满足韩国…

Okhttp响应Json数据

简介 OkHttp是一个高效、现代的HTTP客户端库&#xff0c;专为Android和Java应用程序设计&#xff0c;用于发送网络请求和处理响应。它支持HTTP/2和SPDY协议&#xff0c;允许连接复用&#xff0c;减少延迟&#xff0c;提高网络效率。OkHttp还处理了常见的网络问题&#xff0c;如…