《TCP/IP网络编程》阅读笔记--地址族和数据序列
目录
1--IP地址和端口号
2--地址信息的表示
3--网络字节序与地址变换
4--网络地址的初始化与分配
5--Windows部分代码案例
1--IP地址和端口号
IP 地址分为两类:
① IPv4 表示 4 字节地址族;
② 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 地址分为两类: ① IPv4 表示 4 字节地址族; ② IPv6 表示 16 字节地址族; IPv4 标准的 4 …...
【C++】可变参数模板
2023年9月9日,周六下午 这个还是挺难学的,我学了好几天... 在这里我会举大量的示例程序,这样可以有一个更好的理解, 不定期更新。 目录 推荐文章: 示例程序一:拼接字符串 示例程序二:求整…...
WPF Flyout风格动画消息弹出消息提示框
WPF Flyout风格动画消息弹出消息提示框 效果如图: 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 : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池 lettuce : 采用netty,实例可以再多个线程中进行共享,不存在…...
Java线程之间通信方式
目录 1 线程之间的通信方式主要有以下几种2 共享变量3 锁机制4 条件变量5 信号量6 管道 1 线程之间的通信方式主要有以下几种 在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执…...
【LeetCode-中等题】367. 有效的完全平方数
文章目录 题目方法一:二分查找 题目 方法一:二分查找 找 1 - num 之间的 mid, 开方是整数 就找得到 mid, 不是整数自然找不到mid class Solution { // 二分查找 ;找 1 - num 之间的mid 开方是整数 就找得到 不是…...
英语单词(二)
1.int:整形 2.char:字符型 3.scanner:接受输入,扫描器 4.integer:整数,整形 5.type:类型 6.string:字符串类型 7.double:双精度浮点型...
Django 用相对路径方式引用自定义模块 或 文件
Django的文件夹结构 projectName/websiteName/appName manage.py 所在路径为:D:/projectA/website1/manage.py views.py 所在路径为:D:/projectA/website1/app1/views.py D:/projectA/website1/app1/module1.py 如果要引用自定义模块,引用…...
企业架构LNMP学习笔记22
防盗链原理和实现。 域名A的资源文件,经常被域名B直接调用访问。 而用户经常访问域名B,看到的资源(图片等)以为是域名B的,实际则是域名A的。 但是域名A没有获得任何收益,却要给域名B来源的访问消耗服务器…...
uniapp和小程序设置tabBar和显示与隐藏tabBar
(1)设置tabBar: uni.setTabberItem({ }); wx.setTabberItem({ }); 属性值: indexnumber是tabBar 的哪一项,从左边算起,索引从0开始textstring否tab 上按钮文字iconPathstring否图片路径selectedIc…...
物联网、无线通讯
LAN:局域网 Local Area Network WAN:广域网 Wide Area Network WLAN:无线局域网 Wireless LAN LPWAN:低功耗广域网 Low Power Wide Area Network技术特点无线通信技术应用场景高功耗、高速率的远距离传输3G、4G蜂窝这类传输技术适…...
Pod和容器设计模式
为什么需要Pod 一些应用的实现是需要多个进程配合完成的,由于容器实际上是一个“单进程”模型,如果在容器里启动多个进程会存在进程管理的难题。在Kubernetes里面,实际上会被定义为一个拥有四个容器的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虚拟列 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利…...
OpenCV---视频操作
用摄像头捕获视频 import cv2 as cv import numpy cap cv.VideoCapture(0) while(cap.isOpened()):ret, frame cap.read() # read() 它返回两个值,第一个是布尔值,表示是否成功读取到一帧,第二个是帧本身。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--进程间通信 为了实现进程间通信,使得两个不同的进程间可以交换数据,操作系统必须提供两个进程可以同时访问的内存空间&am…...
mysql中show status参数介绍
Uptime_since_flush_status, 2159061:自上次刷新状态以来的服务器运行时间(以秒为单位)。Uptime, 2159061:服务器的总运行时间(以秒为单位)。Threads_running, 2:当前正在运行的客户端线程数。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. 最深叶节点的最近公共祖先 题目: 给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先 。 回想一下: 叶节点 是二叉树中没有子节点的节点树的根节点的 深度 为 0,如果某一节点的深度为 d,那它…...
【AIGC专题】Stable Diffusion 从入门到企业级实战0402
一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第02节, 利用Stable Diffusion ControlNet Openpose模型精准控制图像生成。上一节,我们介绍了《Stable Diffusion C…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
