当前位置: 首页 > news >正文

《TCP/IP网络编程》阅读笔记--地址族和数据序列

目录

1--IP地址和端口号

2--地址信息的表示

3--网络字节序与地址变换

4--网络地址的初始化与分配

5--Windows部分代码案例


1--IP地址和端口号

IP 地址分为两类:

        ① IPv4 表示 字节地址族;

        ② IPv6 表示 16 字节地址族;

IPv4 标准的 4 字节 IP 地址分为网络地址主机地址,一般分为 A、B、C、D和 E 类型:

        ① A类:网络ID(1字节),主机ID(3字节);首字节范围:0~127;

        ② B类:网络ID(2字节),主机ID(2字节);首字节范围:128~191;

        ③ C类:网络ID(3字节),主机ID(1字节);首字节范围:192~223;

        ④ D类:网络ID(4字节));

        ⑤ E类:已被预约;

端口号:

        端口号用于区分 Socket(不同的应用程序),不能将 1 个端口号分配给不同的 Socket;

        端口号由 16 位构成,可分配的端口号范围是 0-65535,其中 0-1023 是知名端口用于分配给特定的应用程序;

        TCP Socket 和 UDP Socket 不会共用端口号,因此允许重复;

2--地址信息的表示

表示 IPv4 地址的结构体 sockaddr_in

struct sockaddr_in{sa_family_t sin_family; // 地址族uint16_t sin_port; // 16位 TCP/UDP 端口号struct in_addr sin_addr; // 32位IP地址char sin_zero[8]; // 不使用
}

成员 sin_family,表示地址族,常用的地址族如下:

        ① AF_INET 表示 IPv4 网络协议中使用的地址族;

        ② AF_INET6 表示 IPv6 网络协议中使用的地址族;

        ③ AF_LOCAL 表示本地通信中采用的 UNIX 的地址族

// 一般用法:
SOCKADDR_IN servAddr;
servAddr.sin_family = AF_INET;

        bind() 函数第二个参数期望获得 sockaddr 结构体类型,其定义如下:

struct sockaddr{sa_family_t sin_family; // 地址族char sa_data[14]; // 地址信息(包含IP地址和端口号,其它部分填充为0)
}

        一般需要将 sockadd_in 结构体强制转换为 sockaddr 结构体变量,将输入到 bind() 函数中:

        bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)); 其中 serv_addr 是sockadd_in结构体变量;

3--网络字节序与地址变换

CPU向内存保存数据的方式有两种:

        ① 大端序:高位字节存放到低位地址;

        ② 小端序:高位字节存放到高位地址;

        在通过网络传输数据时,约定采用统一的网络字节序方式,即统一为大端序;先把数据数组转化成网络字节序(大端序),再进行传输,接收方收到数据后将网络字节序解析为符合自己CPU的数据方式;

// 字节序转换:
unsigned short htons(unsigned short); // 主机字节序转换为网络字节序
unsigned short ntohs(unsigned short); // 网络字节序转换为主机字节序
unsigned long htonl(unsigned short); // 主机字节序转换为网络字节序
unsigned long ntohl(unsigned short); // 网络字节序转换为主机字节序

        h 表示主机(host)字节序,n 表示网络(network)字节序;s 表示 short(linux 中 short 类型占用 2 字节),l 表示 long(linux 中 long 类型占用 4 字节);

4--网络地址的初始化与分配

        inet_addr() 函数会将字符串形式的 IP 地址转换为 32 位整数型数据,并在转换类型的同时完成网络字节序的转换

        inet_addr() 函数还可以检测无效的 IP 地址

// inet_addr.c
// gcc inet_addr.c -o inet_addr
// ./inet_addr#include <stdio.h>
#include <arpa/inet.h>int main(int argc, char *argv[]){char *arrd1 = "1.2.3.4"; char *arrd2 = "1.2.3.256";unsigned long conv_addr = inet_addr(arrd1);if(conv_addr == INADDR_NONE){printf("Error occured \n");}else{printf("Network ordered integer addr: %#lx \n", conv_addr);}conv_addr = inet_addr(arrd2);if(conv_addr == INADDR_NONE){printf("Error occured \n");}else{printf("Network ordered integer addr: %#lx \n", conv_addr);}return 0;
}

        inet_aton() 函数的功能与 inet_addr() 相同,但其在调用过程中会将转换后的 IP 地址信息代入到 sockaddr_in 结构体中,因此使用频率更高;

// inet_aton.c
// gcc inet_aton.c -o inet_aton
// ./inet_aton#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>void error_handling(char *message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[]){char *addr = "127.232.124.79";struct sockaddr_in addr_inet;if(!inet_aton(addr, &addr_inet.sin_addr)){error_handling("Conversion error");}else{printf("Network ordered integer addr: %#x \n", addr_inet.sin_addr.s_addr);}return 0;
}

        inet_ntoa() 函数与上述两个函数的功能相反,其将网络字节序整数型 IP 地址转换为字符串形式;

        调用 inet_ntoa() 函数后,需要存储对应的字符串信息,否则下次被调用会被覆盖;

// 网络地址的初始化
struct sockaddr_in addr;
char* serv_ip = "211.217.168.13"; // 声明 IP 地址字符串
char* serv_port = "9190"; // 声明端口号字符串
memset(&addr, 0, sizeof(addr)); // 结构体变量 addr 的所有成员初始化为 0
addr.sin_family = AF_INET; // 指定地址族
addr.sin_addr.s_addr = inet_addr(serv_ip); // 基于字符串的 IP 地址初始化
addr.sin_port = htons(atoi(serv_port)); // 基于字符串的端口号初始化

5--Windows部分代码案例

// gcc endian_conv_win.c -o endian_conv_win -lwsock32
// endian_conv_win#include <stdio.h>
#include <winsock.h>void ErrorHandling(char* message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[]){WSADATA wsaData;unsigned short host_port = 0x1234;unsigned short net_port;unsigned long host_addr = 0x12345678;unsigned long net_addr;if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){ErrorHandling("WSAStartup() error!");}net_port = htons(host_port);net_addr = htonl(host_addr);printf("Host ordered port: %#x \n", host_port);printf("Network ordered port: %#x \n", net_port);printf("Host ordered address: %#lx \n", host_addr);printf("Network ordered address: %#lx \n", net_addr);WSACleanup();return 0;
}

// gcc inet_adrconv_win.c -o inet_adrconv_win -lwsock32
// inet_adrconv_win#include <stdio.h>
#include <string.h>
#include <winsock2.h>void ErrorHandling(char* message){fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[]){WSADATA wsaData;if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){ErrorHandling("WSAStartup() error!");}// inet_addr 函数调用示例{char *addr = "127.212.124.78";unsigned long conv_addr = inet_addr(addr);if(conv_addr == INADDR_NONE){printf("Error occured! \n");}else{printf("Network ordered integer addr: %xlx \n", conv_addr);}}// inet_ntoa 函数调用示例{struct sockaddr_in addr;char *strPtr;char strArr[20];addr.sin_addr.s_addr = htonl(0x1020304);strPtr = inet_ntoa(addr.sin_addr);strcpy(strArr, strPtr);printf("Dotted-Decimal notation3 %s \n", strArr);}WSACleanup();return 0;}

相关文章:

《TCP/IP网络编程》阅读笔记--地址族和数据序列

目录 1--IP地址和端口号 2--地址信息的表示 3--网络字节序与地址变换 4--网络地址的初始化与分配 5--Windows部分代码案例 1--IP地址和端口号 IP 地址分为两类&#xff1a; ① IPv4 表示 4 字节地址族&#xff1b; ② IPv6 表示 16 字节地址族&#xff1b; IPv4 标准的 4 …...

【C++】可变参数模板

2023年9月9日&#xff0c;周六下午 这个还是挺难学的&#xff0c;我学了好几天... 在这里我会举大量的示例程序&#xff0c;这样可以有一个更好的理解&#xff0c; 不定期更新。 目录 推荐文章&#xff1a; 示例程序一&#xff1a;拼接字符串 示例程序二&#xff1a;求整…...

WPF Flyout风格动画消息弹出消息提示框

WPF Flyout风格动画消息弹出消息提示框 效果如图&#xff1a; XAML: <Window x:Class"你的名称控件.FlyoutNotication"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xam…...

Spring Boot 集成 Redis

Spring-data-redis 在 Spring 中整合 Redis jedis : 采用的直连&#xff0c;多个线程操作的话&#xff0c;是不安全的&#xff0c;如果想要避免不安全的&#xff0c;使用 jedis pool 连接池 lettuce : 采用netty&#xff0c;实例可以再多个线程中进行共享&#xff0c;不存在…...

Java线程之间通信方式

目录 1 线程之间的通信方式主要有以下几种2 共享变量3 锁机制4 条件变量5 信号量6 管道 1 线程之间的通信方式主要有以下几种 在实际开发时&#xff0c;一个进程中往往有很多个线程&#xff0c;大多数线程之间往往不是绝对独立的&#xff0c;比如说我们需要将A和B 两个线程的执…...

【LeetCode-中等题】367. 有效的完全平方数

文章目录 题目方法一&#xff1a;二分查找 题目 方法一&#xff1a;二分查找 找 1 - num 之间的 mid&#xff0c; 开方是整数 就找得到 mid&#xff0c; 不是整数自然找不到mid class Solution { // 二分查找 &#xff1b;找 1 - num 之间的mid 开方是整数 就找得到 不是…...

英语单词(二)

1.int:整形 2.char:字符型 3.scanner:接受输入,扫描器 4.integer:整数,整形 5.type:类型 6.string:字符串类型 7.double:双精度浮点型...

Django 用相对路径方式引用自定义模块 或 文件

Django的文件夹结构 projectName/websiteName/appName manage.py 所在路径为&#xff1a;D:/projectA/website1/manage.py views.py 所在路径为&#xff1a;D:/projectA/website1/app1/views.py D:/projectA/website1/app1/module1.py 如果要引用自定义模块&#xff0c;引用…...

企业架构LNMP学习笔记22

防盗链原理和实现。 域名A的资源文件&#xff0c;经常被域名B直接调用访问。 而用户经常访问域名B&#xff0c;看到的资源&#xff08;图片等&#xff09;以为是域名B的&#xff0c;实际则是域名A的。 但是域名A没有获得任何收益&#xff0c;却要给域名B来源的访问消耗服务器…...

uniapp和小程序设置tabBar和显示与隐藏tabBar

&#xff08;1&#xff09;设置tabBar&#xff1a; uni.setTabberItem({ }); wx.setTabberItem({ }); 属性值&#xff1a; indexnumber是tabBar 的哪一项&#xff0c;从左边算起&#xff0c;索引从0开始textstring否tab 上按钮文字iconPathstring否图片路径selectedIc…...

物联网、无线通讯

LAN&#xff1a;局域网 Local Area Network WAN&#xff1a;广域网 Wide Area Network WLAN&#xff1a;无线局域网 Wireless LAN LPWAN&#xff1a;低功耗广域网 Low Power Wide Area Network技术特点无线通信技术应用场景高功耗、高速率的远距离传输3G、4G蜂窝这类传输技术适…...

Pod和容器设计模式

为什么需要Pod 一些应用的实现是需要多个进程配合完成的&#xff0c;由于容器实际上是一个“单进程”模型&#xff0c;如果在容器里启动多个进程会存在进程管理的难题。在Kubernetes里面&#xff0c;实际上会被定义为一个拥有四个容器的Pod。 Pod相当于进程组 Kubernetes 是…...

docker系列(3) - 常用软件安装

文章目录 3. docker安装常用软件3.1 安装nginx3.2 安装redis3.3 安装mysql3.4 部署springboot程序3.4.1 编写dockerfile3.4.2 构建镜像3.4.3 启动镜像 3. docker安装常用软件 3.1 安装nginx docker pull nginx#挂载启动 docker run -it -d \ --namenginx \ --networkpub_netw…...

Apache Hive之数据查询

文章目录 版权声明数据查询环境准备基本查询准备数据select基础查询分组、聚合JOINRLIKE正则匹配UNION联合Sampling采用Virtual Columns虚拟列 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利…...

OpenCV---视频操作

用摄像头捕获视频 import cv2 as cv import numpy cap cv.VideoCapture(0) while(cap.isOpened()):ret, frame cap.read() # read() 它返回两个值&#xff0c;第一个是布尔值&#xff0c;表示是否成功读取到一帧&#xff0c;第二个是帧本身。cv.imshow(Video, frame)if c…...

《TCP/IP网络编程》阅读笔记--进程间通信

目录 1--进程间通信 2--pipe()函数 3--代码实例 3-1--pipe1.c 3-2--pipe2.c 3-3--pipe3.c 3-4--保存信息的回声服务器端 1--进程间通信 为了实现进程间通信&#xff0c;使得两个不同的进程间可以交换数据&#xff0c;操作系统必须提供两个进程可以同时访问的内存空间&am…...

mysql中show status参数介绍

Uptime_since_flush_status, 2159061&#xff1a;自上次刷新状态以来的服务器运行时间&#xff08;以秒为单位&#xff09;。Uptime, 2159061&#xff1a;服务器的总运行时间&#xff08;以秒为单位&#xff09;。Threads_running, 2&#xff1a;当前正在运行的客户端线程数。T…...

Tomcat服务的部署及配置优化

文章目录 1. Tomcat的相关介绍1.1 Tomcat简介1.2 Tomcat的核心组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器 1.3 Tomcat的功能组件1.3.1 connector连接器1.3.2 container容器1.3.2.1 子容器及其相关功能 1.4 主要作用1.5 Tmocat处理请求的过程 2. Tomcata服务部署2.1 安装…...

入门力扣自学笔记279 C++ (题目编号:1123)

1123. 最深叶节点的最近公共祖先 题目&#xff1a; 给你一个有根节点 root 的二叉树&#xff0c;返回它 最深的叶节点的最近公共祖先 。 回想一下&#xff1a; 叶节点 是二叉树中没有子节点的节点树的根节点的 深度 为 0&#xff0c;如果某一节点的深度为 d&#xff0c;那它…...

【AIGC专题】Stable Diffusion 从入门到企业级实战0402

一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第02节&#xff0c; 利用Stable Diffusion ControlNet Openpose模型精准控制图像生成。上一节&#xff0c;我们介绍了《Stable Diffusion C…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...