网络编程——预备知识

网络编程——预备知识

  • 🍃套接字
    • 🌿什么是套接字
    • 🌿套接字的类型
    • 🌿套接字的位置
  • 🍃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_xxxchar 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.rhkb.cn/news/280008.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】: Django Web开发实战(详细教程)

Python Django全面介绍 Django是一个非常强大的Python Web开发框架&#xff0c;它以"快速开发"和"干净、实用的设计"为设计宗旨。本文将从Django的基本概念开始&#xff0c;逐渐引导大家理解如何使用Django构建复杂的web应用程序。 Django基本概念与原理…

浅谈前端路由原理hash和history

1、认识前端路由 本质 前端路由的本质&#xff0c;是监听 url 地址或 hash 值的改变&#xff0c;来切换渲染对应的页面组件 前端路由分为两种模式 hash 模式 history 模式 两种模式的对比 2、hash 模式 &#xff08;1&#xff09;hash 定义 hash 模式是一种把前端路由的路…

【MySQL】数据库的基础概念

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

【教程】rax3000m emmc刷机 支持硬件QOS MT7981到底值不值

为什么选择rax3000m&#xff1f; 1、恩山论坛237大佬放出了硬件QOS功能&#xff0c;而很多几百元路由器一旦开启QOS就会变软件NAT走CPU转发&#xff0c;效果还不如x86软路由。这样就非常适合刷机&#xff0c;在家里跑pt、迅雷等任务时候不会卡顿&#xff0c;实测&#xff0c;丢…

智慧公厕:卫生、便捷、安全的新时代厕所变革

在城市快速发展的背景下&#xff0c;公共厕所的建设和管理变得越来越重要。智慧公厕作为厕所变革的一项全新举措&#xff0c;通过建立公共厕所全面感知监测系统&#xff0c;以物联网、互联网、大数据、云计算、自动化控制技术为支撑&#xff0c;实现对公共厕所的智能化管理和运…

Fabric.js在vue2中使用

Fabric.js安装 这里我是基于vue来使用的&#xff0c;先安装上Fabric.js npm install fabric 在main.js中 import fabric from fabric Vue.use(fabric);Fabric 提供了 7 种基础形状&#xff1a; fabric.Circle (圆)fabric.Ellipse (椭圆)fabric.Line (线)fabric.Polyline (多条…

camunda 与 pycamunda学习

camunda 与 pycamunda 相关链接&#xff1a; camunda 官方社区&#xff1a;https://docs.camunda.org/manual/7.17/ 官方社区提供的REST_API:https://docs.camunda.org/manual/7.17/reference/rest/ GITHUB 社区&#xff1a;https://github.com/camunda-community-hub Git…

18.WEB渗透测试--抓包技术(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;17.WEB渗透测试--Kali Linux(五)-CSDN博客 网站协议抓包 1.BurpSuite Burp Suite 是用…

makefile基础与实战编译C++项目

从源码到执行程序 makefile运行流程 &#xff1a;这个符号用于在执行的命令之前&#xff0c;通常会告诉make不要输出命令本身&#xff0c;只输出命令的结果。但是当它位于命令行的开头时&#xff0c;它通常会让Make静默执行该命令&#xff0c;即不在命令行中显示该命令&#xf…

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个&#xff08;Liu&#xff0c;2015&#xff09;。华为为此次转型成立了一个专门的团队&#xff0c;从大约20人开始&#xff0c;他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

MacBook使用——彻底卸载并删除软件:NTFS for Mac

问题 之前因MacBook读写NTFS格式移动硬盘&#xff0c;我安装并使用了 Paragon NTFS for Mac &#xff0c;试用期结束后将其从【应用程序】中卸载移除了。但之后每次开机启动时&#xff0c;系统还是会弹出【激活】通知&#xff0c;如下图 解决 Step1、在用户目录下的 Library 目…

STM32中MicroLIB的关闭为什么会导致卡死----解析

STM32MicroLIB 大家好我是 MHZ 。最近又开始往回捡单片机的知识了~ 之前大学的时候都没用过 STM 的 CubeMX&#xff0c;这会拿来用着感觉很方便啊~ 果然科技在进步&#xff01; 在开发使用 Keil 对 STM32 进行开发的时候在会有一个叫做 MicroLIB 的选项。 这个的具体原因我搜…

c++ 指针大小

C的一个指针占内存几个字节&#xff1f; 结论&#xff1a; 取决于是64位编译模式还是32位编译模式&#xff08;注意&#xff0c;和机器位数没有直接关系&#xff09; 在64位编译模式下&#xff0c;指针的占用内存大小是8字节在32位编译模式下&#xff0c;指针占用内存大小是4字…

联合和枚举

联合体类型的声明 联合体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;它允许在同一内存位置存储不同类型的数据。与结构体不同的是&#xff0c;联合体的所有成员共享同一块内存空间&#xff0c;因此联合体的大小取决于它最大的成员的大小。 所以联合体也叫…

基于python的变配电室运行状态评估与预警系统flask-django-nodejs-php

近年来,随着我国工业化、城镇化步伐的不断加快&#xff0c;城市配电网络取得令人瞩目的发展成果。变配电室是供配电系统的核心&#xff0c;在供配电系统中占有特殊的重要地位[1]。变配电室电气设备运行状态和环境信息缺乏必要的监测评估预警手段&#xff0c;如有一日遭遇突发情…

蓝桥杯之动态规划冲刺

文章目录 动态规划01背包小练一下01背包网格图上的DP完全背包 最长公共字符串最长递增子序列 动态规划 动态规划&#xff1a;确定好状态方程&#xff0c;我们常常是确定前 当状态来到 i 时&#xff0c;前 i 个物体的状态是怎么样的&#xff0c;我们并不是从一个点去考虑&#x…

Python爬虫获取接口数据

Python爬虫获取接口数据 正常人的操作​​​​​​​​​​爬虫的思路标题获取请求信息标题请求转换为代码完整代码请求返回信息执行程序获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获…

【计算机组成】27、有符号数和无符号数

文章目录 int 是有符号数 uint 是无符号数 所以 int8 的 范围是 -128 到 127 uint8 的范围是 0 到 255 同样的二进制 1000-0000 如果用 uint8 解释则为 255&#xff0c;但如果用 int8 解释则为 -128 同样的二进制 0111-1111 如果用 uint8 解释则为 127&#xff0c;但如果用…

云蜜罐技术(德迅猎鹰)诞生

数字化程度高且高价值信息密集的行业&#xff0c;如金融、能源、互联网、政府、教育、医疗、军工等行业&#xff0c;面对日益规模化、专业化的网络攻击&#xff0c;渐渐不再满足于一味的防守加固。除了巩固防线之外&#xff0c;他们愈发看重主动出击、感知更大范围内的攻击&…

MySQL的概述与安装

一、数据库的基本概念&#xff1a; 1.1 数据&#xff1a; 1&#xff09; 描述事物的符号记录称为数据&#xff08;Data&#xff09;。数字、文字、图形、图像、声音、档案记录等 都是数据。 2&#xff09;数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是…