sockaddr数据结构
文章目录
- 1 sockaddr数据结构
- 1.1 sockaddr数据结构详解
- 1.2 地址族字段详解
1 sockaddr数据结构
1.1 sockaddr数据结构详解
很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是其他的,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。
通用套接字地址格式:
/* POSIX.1g 规范规定了地址族为2字节的值. */
typedef unsigned short int sa_family_t;
/* 描述通用套接字地址 */
struct sockaddr{sa_family_t sa_family; /* 地址族. 16-bit*/char sa_data[14]; /* 具体的地址值 112-bit */
};
IPv4 套接字格式地址:
/* IPV4套接字地址,32bit值. */
typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};/* 描述IPV4的套接字地址格式 */
struct sockaddr_in
{sa_family_t sin_family; /* 16-bit */in_port_t sin_port; /* 端口口 16-bit*/struct in_addr sin_addr; /* Internet address. 32-bit *//* 这里仅仅用作占位符,不做实际用处 */unsigned char sin_zero[8];
};
IPv4的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位端口号和32位IP地址,但是sock API的实现早于ANSI C标准化,那时还没有void *类型,因此这些像bind 、accept函数的参数都用struct sockaddr *类型表示,在传递参数之前要强制类型转换一下,例如:
struct sockaddr_in servaddr;
bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr)); /* initialize servaddr */
IPv6 套接字地址格式:
struct sockaddr_in6
{sa_family_t sin6_family; /* 16-bit */in_port_t sin6_port; /* 传输端口号 # 16-bit */uint32_t sin6_flowinfo; /* IPv6流控信息 32-bit*/struct in6_addr sin6_addr; /* IPv6地址128-bit */uint32_t sin6_scope_id; /* IPv6域ID 32-bit */
};
整个结构体长度是 28 个字节,其中流控信息和域 ID 先不用管,这两个字段,一个在 glibc 的官网上根本没出现,另一个是当前未使用的字段。这里的地址族显然应该是 AF_INET6,端口同 IPv4 地址一样,关键的地址从 32 位升级到 128 位,这个数字就大到恐怖了,完全解决了寻址数字不够的问题。
本地套接字地址格式:
struct sockaddr_un {unsigned short sun_family; /* 固定为 AF_LOCAL */char sun_path[108]; /* 路径名 */
};
各种套接字对比分析:
1.2 地址族字段详解
地址族字段,它表示使用什么样的方式对地址进行解释和保存。地址族在 glibc 里的定义非常多,常用的有以下几种:
- AF_LOCAL:表示的是本地地址,对应的是 Unix 套接字,这种情况一般用于本地 socket 通信,很多情况下也可以写成 AF_UNIX、AF_FILE;
- AF_INET:因特网使用的 IPv4 地址;
- AF_INET6:因特网使用的 IPv6 地址。
这里的 AF_ 表示的含义是 Address Family,但是很多情况下,我们也会看到以 PF_ 表示的宏,比如 PF_INET、PF_INET6 等,实际上 PF_ 的意思是 Protocol Family,也就是协议族的意思。我们用 AF_xxx 这样的值来初始化 socket 地址,用 PF_xxx 这样的值来初始化 socket。我们在 <sys/socket.h> 头文件中可以清晰地看到,这两个值本身就是一一对应的。
/* 各种地址族的宏定义 */
#define AF_UNSPEC PF_UNSPEC
#define AF_LOCAL PF_LOCAL
#define AF_UNIX PF_UNIX
#define AF_FILE PF_FILE
#define AF_INET PF_INET
#define AF_AX25 PF_AX25
#define AF_IPX PF_IPX
#define AF_APPLETALK PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_ATMPVC PF_ATMPVC
#define AF_X25 PF_X25
#define AF_INET6 PF_INET6
参考资料:
- C/C++从入门到精通-高级程序员之路【奇牛学院】
sockaddr数据结构相关推荐
- 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client
1 Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...
- linux的基础知识——网络字节序转化,ip地址转换函数,sockaddr数据结构
1.网络字节序 TCP/IP协议规定,网络数据流采用大端字节序,即低地址高字节.为了使网络程序具有可移植性,使得同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机 ...
- 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)
此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分. 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小 ...
- TCP/IP,网络字节序与本地转换,Linux提供的转换函数htonl,htons等,sock_addr的数据结构与内容
TCP/IP,网络字节序与本地转换,Linux提供的转换函数htonl,htons等,sock_addr的数据结构与内容 一.网络字节序存储方式: 小端存储:高位存放高地址,0x12345678的小段 ...
- sockaddr地址结构——socket
sockaddr地址结构 bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 像bind这些函数API在很 ...
- socket编程和并发服务器
socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socke ...
- Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...
- 套接字编程--TCP
一.socket编程 socket本身有"插座"的意思,因此用来描述网络连接的一对一关系."在TCP/IP协议中,"TP地址+TCP或端口号"唯一标识 ...
- Linux--网络编程
1.Linux的优点之一就是在于它丰富而稳定的网络协议栈,其范围是从协议无关层(如通用的socket层接口和设备层)到各种网络协议的实现 2.对于网络理论介绍一般采用OSI模型,但是Linux中网络栈 ...
最新文章
- 《Android 开发入门与实战(第二版)》——6.6节配置改变
- [转载] 七龙珠第一部——第032话 飞天要塞
- 基于R语言构建的电影评分预测模型
- python开发好学吗-Python的前景和Python好不好学呢?
- cordova 发布 android release 签名打包
- 怎么样从一个疯狂下载者成为一个学习者
- .NET6之MiniAPI(十三):健康检查
- oracle查询当前用户名下所有表
- aspen怎么做灵敏度分析_不会敲代码怎么做智能分析?用奥威商业智能BI
- 王者荣耀回应服务器崩了:已处理完成 将陆续补发相应赔偿
- struts2 自带的 token防止表单重复提交拦截器
- Tensorflow——Tensorflow的用途、安装、数据流图
- 织梦自定义表单限制IP24小时只能提交一次方法
- Juniper路由器基本命令及中文解
- 联发科MT6139射频处理器工作原理分析
- 【Java虚拟机】第一章、Java虚拟机是如何产生的
- ACA-PEG-MAL,丙烯酰胺PEG马来酰亚胺
- nokia 诺基亚nth主题说明
- 2022-2028年中国物流地产行业市场发展潜力及投资风险预测报告
- 1079 日K蜡烛图
热门文章
- PCB 零件尺寸图:Arduino Mega 2560 尺寸
- stm32f407 usb cdc设备无法启动问题
- c标准基本库函数:libc、glibc的关系
- 随机接入响应(RAR,即MSG2)发送过程
- ESP32的FLASH、NVS、SPIFFS、OTA等存储分布以及启动过程
- 爱国者强烈推荐:nanopiR1——你懂的功能,懂你的开发板
- AI+云 华为开启智能时代新纪元
- dotweb——go语言的一个微型web框架(二)启动dotweb
- Bzoj4817:[SDOI2017]树点涂色
- Codeforces 757C - Felicity is Coming!