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

字节序与Socket编程

字节序

字节序分为大端字节序(Big-Endian) 和小端字节序(Little-Endian)。大端字节序是指一个整
数的最高位字节(23 ~ 31 bit)存储在内存的低地址处,低位字节(0 ~ 7 bit)存储在内存的高地址处;小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处。 (小端低对低,高对高;大端符合人的阅读顺序)Linux是x86架构,为小端字节序。
在这里插入图片描述
网络字节顺序是 TCP/IP 中规定好的一种数据表示格式,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用大端排序方式。
BSD Socket提供了封装好的转换接口,方便程序员使用。包括从主机字节序到网络字节序的转换函数:htons、htonl;从网络字节序到主机字节序的转换函数:ntohs、ntohl。

h - host 主机,主机字节序
to - 转换成什么
n - network 网络字节序
s - short unsigned short
l - long unsigned int

#include <arpa/inet.h>
// 转换端口
uint16_t htons(uint16_t hostshort); // 主机字节序 - 网络字节序
uint16_t ntohs(uint16_t netshort); 
// 转IP
uint32_t htonl(uint32_t hostlong); // 主机字节序 - 网络字节序
uint32_t ntohl(uint32_t netlong); 

Socket端口

TCP/IP 协议族有 sockaddr_in 和 sockaddr_in6 两个专用的 socket 地址结构体,它们分别用于 IPv4 和 IPv6

#include <netinet/in.h>

struct sockaddr_in
{
   
	sa_family_t sin_family; /* __SOCKADDR_COMMON(sin_) */
	in_port_t sin_port; /* Port number. */
	struct in_addr sin_addr; /* Internet address. */
	/* Pad to size of `struct sockaddr'. */
	unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE -
	sizeof (in_port_t) - sizeof (struct in_addr)];
};

struct in_addr
{
   
	in_addr_t s_addr;
};

struct sockaddr_in6
{
   
	sa_family_t sin6_family;
	in_port_t sin6_port; /* Transport layer port # */
	uint32_t sin6_flowinfo; /* IPv6 flow information */
	struct in6_addr sin6_addr; /* IPv6 address */
	uint32_t sin6_scope_id; /* IPv6 scope-id */
};

typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))

socket 函数

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> // 包含了这个头文件,上面两个就可以省略
int socket(int domain, int

http://www.kler.cn/a/532096.html

相关文章:

  • 2024年度十大网络安全热点事件盘点:时代暗涌下的安全危机
  • 在Mac mini M4上部署DeepSeek R1本地大模型
  • kaggle-ISIC 2024 - 使用 3D-TBP 检测皮肤癌-学习笔记
  • 差值 dp 入门
  • C#从XmlDocument提取完整字符串
  • c++可变参数详解
  • 想品客老师的第十一天:模块化开发
  • Java线程创建与管理:继承、实现、Callable与线程池
  • 【Java知识】使用Java实现地址逆向解析到区划信息
  • sql字符串函数及字符拼接函数
  • kubernetes 核心技术-集群安全机制 RBAC
  • 流式学习(简易版)
  • 刷题笔记 哈希表-1 哈希表理论基础
  • AI 编程工具—Cursor进阶使用 Agent模式
  • 【棋弈云端】网页五子棋项目测试报告
  • 趣味Python100例初学者练习01
  • Chapter 6 -Fine-tuning for classification
  • 解析Python装饰器高级用法6项
  • 算法随笔_38: 最多能完成排序的块
  • 蓝桥杯真题 - 子串简写 - 题解
  • 开源 CSS 框架 Tailwind CSS
  • upload-labs安装与配置
  • SQL Server中DENSE_RANK()函数:简洁处理连续排名
  • 数据结构:树和二叉树概念_堆篇
  • apikey存储方案探秘(deepseek-R1对话)
  • 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)