网络编程——预备知识

news2024/11/24 8:29:49

网络编程——预备知识

  • 🍃套接字
    • 🌿什么是套接字
    • 🌿套接字的类型
    • 🌿套接字的位置
  • 🍃IP
  • 🍃端口号Port
  • 🍃字节序
  • 🍃地址信息结构(结构体类型)

🍃套接字

🌿什么是套接字

本质:独立于协议之上的一种通用的网络编程的接口。
用户程序可以借助套接字来实现数据的发送以及接收,像是对”文件“的操作(读写)。
因此:套接字可以被看成一种特殊的文件,好处是:将应用程序访问协议栈的的方式进行了统一。
访问协议栈之前先拥有一个访问协议栈的句柄(套接字对象socket)–》实现了用户空间访问内核空间。
socket:单词就是插座,意味着将外设和电路进行了连接
socket的官方表示IP:PORT
通信本质:用户进程使用TCP/IP协议栈中的网络协议以及数据链路层所提供的的驱动程序模块进行数据交互。
思考:既然套接字被看成是一种特殊的文件,对于文件的操作一般使用句柄来完成。
句柄:套接字对象(被创建出来的)—》使用接口(函数)来获取的。
TCP/IP协议栈:网络协议的集合,构成网络通信的核心骨干。
在这里插入图片描述
总结:用户进程在用户空间即用户态,多种网络协议存在内核态,因此用户需要借助套接字这个接口来使用协议栈中的部分协议搭配驱动程序模块来完成网络通信。

🌿套接字的类型

为了满足应用程序的各种性能要求,套接字被分为3种类型:

  1. 流式套接字:SOCK_STREAM —》针对TCP协议
  2. 数据报套接字:SOCK_DGRAM ----》针对UDP协议
  3. 原始套接字:SOCK_RAW 可以让应用层直接访问网络层中的IP协议

🌿套接字的位置

处于应用层传输层之间
TCP/IP四层:应用层和传输层之间
OSI七层模型:会话层和传输层之间
在这里插入图片描述

🍃IP

概念:网络中一台主机的唯一标识,IPv4协议占据4个字节,以点分十进制形式表示。
IP的构成:网络地址 (高位) + 主机地址(低位)
IP分类:
A类:1个字节网络地址 + 3字节主机地址 ,最高位为:0
B类:2个字节网络地址 + 2字节主机地址 ,最高位为:10
C类:3个字节网络地址 + 1字节主机地址 ,最高位为:110
D类:不区分网络地址和主机地址,用于组播,固定最高字节的前4位必须为:1110

  • 组播地址的范围:224.0.0.0 ~ 239.255.255.255
    • 正常使用的组播地址范围:224.0.0.1 ~ 239.255.255.254
  • 注意:凡是以255结尾的IP地址均属于“广播地址”

E类:等待将来使用

🍃端口号Port

Port占据2个字节short类型
端口号是用来唯一标识一台主机上的某一个进程。
为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理,使用端口号来区别
端口号一般由IANA (Internet Assigned Numbers Authority) 管理
众所周知端口:11023(1255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151(我们选择端口的范围)eg:8888 9999 10086…
动态或私有端口:49152~65535

🍃字节序

大端字节序:将低字节处的内容存储在高地址,将高字节内容存储在低地址
小端字节序:将低字节处的内容存储在低地址,将高字节内容存储在高地址
在这里插入图片描述
思考:如果两台机器在通信是,字节序不一致,会出现数据接收错序的问题!但是也不能避免!
解决方案:网络通信时,所有的主机在发送数据时,全部按照网络字节序去发送
主机字节序:本地字节序(小端存储/大端存储)
网络字节序:(本质:大端存储)
注意:在大部分PC机上,基本都是小端字节序,当应用进程将整数送入socket前,需要转化成网络字节
序;当应用进程从socket取出整数后,要转化成小端字节序)
故:字节序解决的主要是多字节的数据存储的问题!

  1. IP字节序转换函数:4个字节
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
inet_aton()
将strptr所指的字符串转换成32位的网络字节序二进制值
#include <arpa/inet.h>
int inet_aton(const char *strptr,struct in_addr *addrptr);1inet_addr() -----》常用的(发送时,将IP地址从主机字节序转换成网络字节序)
功能同上,返回转换后的地址。
in_addr_t inet_addr(const char *strptr);2inet_ntoa()32位网络字节序二进制地址转换成点分十进制的字符串。
char *inet_ntoa(stuct in_addr inaddr);
  1. Port字节序转换函数:2个字节
#include <arpa/inet.h>
主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short); ---》常用
网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short); ---》常用

🍃地址信息结构(结构体类型)

查询地址信息结构的方法:man 7 ip

1)通用地址结构:
struct sockaddr
{
	u_short sa_family; // 地址族, AF_xxx
	char sa_data[14]; // 14字节协议地址
};2)Internet协议地址结构: ----》平常自定义地址信息结构首选的类型!(因为更详细)
struct sockaddr_in {
	sa_family_t sin_family; /* address family: AF_INET */
	in_port_t sin_port; /* port in network byte order */
	struct in_addr sin_addr; /* internet address */
};
IPv4地址结构:
struct in_addr {
	uint32_t s_addr; /* address in network byte order*/
};
注意:地址信息结构如果使用Internet协议定义的,最后在绑定时,要强转为通用的地址信息结构类型
//定义地址信息结构,保存服务器端的Ip地址和端口
struct sockaddr_in serverAddr;
//将serverAddr这个结构变量的空间内容清空
//memset(&serverAddr, '\0', sizeof(serverAddr));
bzero(&serverAddr, sizeof(serverAddr));
//赋值
//给地址族赋值
serverAddr.sin_family = AF_INET;
//给端口号赋值
serverAddr.sin_port = htons(8888);
//给IP地址赋值
serverAddr.sin_addr.s_addr = inet_addr("192.168.16.188");
补充:清空函数
#include <strings.h>
void bzero(void *s, size_t n);
功能:清空一片地址空间内容
参数1:空间首地址
参数2:空间大小

案例:验证连接服务器这边连接成功的客户端的IP和端口是谁?

#include <stdio.h>
#include <strings.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, const char *argv[])
{:
	//定义地址信息结构,用来存储客户端的IP 和 端口
	struct sockaddr_in clientAddr;
	//清空
	bzero(&clientAddr, sizeof(clientAddr));
	//打印接收到的客户端的IP 和 端口
	printf("客户端IP:%s\n",inet_ntoa(clientAddr.sin_addr));//主机字节序
	printf("客户端Port:%hd\n",ntohs(clientAddr.sin_port));//主机字节序
	return 0;
}

在这里插入图片描述

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

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

相关文章

spring整合Sentinel

安装sentinel&#xff1a; 执行命令; java -jar sentinel-dashboard-1.8.6.jar 注:sentinel的默认端口为8080&#xff0c;容易出现tomcat的冲突。 当端口冲突&#xff0c;可以使用该指令修改sentinel的端口 默认账号和密码都为sentinel Springcloud整合sentinel&#xff1a;…

【MySQL】学习和总结使用列子查询查询员工工资信息

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-5odctDvQ0AHJJc1C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

java 数据结构 排序算法

目录 排序 插入排序 直接插入排序 希尔排序( 缩小增量排序 )&#xff1a; 直接选择排序 堆排序 交换排序 冒泡排序 快速排序递归 Hoare法 挖坑法 前后指针法 快速排序优化 快速排序非递归 归并排序 归并排序非递归 排序算法复杂度及稳定性分析 计数排序 排序…

YOLO_you only look once

前言 计算机图形学的课程即将结束&#xff0c;我需要提交一份关于YOLO模型的学习报告。在这段时间里&#xff0c;我对YOLO进行了深入的学习和研究&#xff0c;并记录下了我的学习过程和心得体会。本文将详细介绍YOLO模型的原理、优缺点以及应用领域&#xff0c;希望能够为后续…

matlab 混沌系统李雅普洛夫指数谱相图分岔图和庞加莱界面

1、内容简介 略 65-可以交流、咨询、答疑 2、内容说明 matlab 混沌系统李雅普洛夫指数谱相图分岔图和庞加莱界面 混沌系统李雅普洛夫指数谱相图分岔图和庞加莱界面 李雅普洛夫指数谱、相图、分岔图、庞加莱界面 3、仿真分析 略 4、参考论文 略

UE4_调试工具_绘制调试球体

学习笔记&#xff0c;仅供参考&#xff01; 效果&#xff1a; 步骤&#xff1a; 睁开眼睛就是该变量在此蓝图的实例上可公开编辑。 勾选效果&#xff1a;

函数栈帧的创建和销毁 - 局部变量|函数传参|函数调用|函数返回|图文详解

目录 1.寄存器EBP和ESP 2.函数栈帧的创建 3.函数的调用 4. 函数栈帧的销毁 函数栈帧&#xff08;function stack frame&#xff09;是在函数调用期间在栈上分配的内存区域&#xff0c;用于存储函数的局部变量、参数、以及用于函数调用和返回的相关信息。每当函数被调用时&a…

Redis 应用与原理(三)

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 Redis Cluster 解决方案 基础概念 首先&#xff0c;分析一下主从哨兵模式带来的问题&#xff1a; 在主从 哨兵的模式下&#xff0c;仍然只有一个 Master 节点&#xff0c;当并发请求较大时&#xff0c;哨兵…

config.properties的存放位置在Javaweb和Java工程中的区别

Java项目中&#xff1a;一般是与src平行的设置一个config目录&#xff0c;然后把配置文件放到config目录里面 Javaweb中&#xff1a;一般放到src目录下 顺便补习一下Properties的用法 package config;import java.io.FileInputStream; import java.io.FileOutputStream; impor…

JD商品详情原数据 API 返回值说明

一、应用场景 商品详情原数据API的应用场景广泛而多样。具体来说&#xff0c;它可以被用于以下方面&#xff1a; 1、电商平台数据分析&#xff1a;电商平台可以通过商品详情原数据API提取商品销售数据、质量评分、评论和反馈等信息&#xff0c;从而帮助用户更好地理解市场和竞…

QT charts模块画图

QT charts模块画图 在项目中使用Qt Charts模块,必须在项目的配置文件(.pro文件)添加行语句。 QT += core gui charts或者 QT += core gui QT += charts在需要使用QtCharts的类的头文件或源文件中,包含如下语句 #include <QWidget> #include &…

Java基础 学习笔记六

自增运算符 /* 自加1-- 自减11. 可以出现在变量前&#xff0c;也可以出现在变量后i 可以i 也可以像这种欲奴算符&#xff0c;只有一边有操作数&#xff0c;我们把这种运算符称为 一元运算符a b 这里的 两边有两个操作数&#xff0c;所以这种运算符被称为 二元运算符2. 无论出…

基于微信小程序的电影交流平台

技术&#xff1a;springbootmysqlvue 一、背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0c;尤其是规…

matlab中Signal Editor定义梯形信号输出矩形信号

matlab中Signal Editor定义梯形信号输出矩形信号&#xff0c;可以通过如下勾选差值数据实现梯形信号输出。

nginx学习记录-目录结构及基本配置

1. nginx目录结构 执行tree命令就可以看到nginx的目录结构了&#xff0c;主要有4个&#xff0c;分别是配置目录conf&#xff0c;还有界面目录html&#xff0c;日志目录logs以及程序sbin/nginx。 2. nignx基本配置 nginx的主要配置文件为/usr/local/nginx/conf/nginx.conf&…

网络协议与层次划分:探索计算机网络体系结构

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

关于继承是怎么样的?那当然是很好理解之

本文描述了关于继承的大部分知识&#xff0c;但是并不全&#xff0c;每篇博客之间的知识都有互串&#xff0c;所以需要把几篇文章合起来看&#xff0c;学会融会贯通&#xff01; 温馨提示&#xff1a;使用PC端观看&#xff0c;效果更佳&#xff01; 目录 1.继承是什么 2.什…

FREERTOS任务通知

从 v8.2.0 版本开始&#xff0c;FreeRTOS 新增了任务通知(Task Notifictions)这个功能&#xff0c;可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高。 有个疑惑&#xff1a; 队列是两个互通消息的任务之外的一个特性&#xff0c;而…

基于springboot+vue的中山社区医疗综合服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Vue.js+SpringBoot开发创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…