linux socket结构,【Linux网络编程】常见 Socket 地址结构

本文详细介绍了Linux网络编程中常见的Socket地址结构,包括IPv4、IPv6、UNIX域、数据链路及通用套接字地址结构。每种结构都有详细的字段说明,便于读者理解并应用于实际编程场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Linux网络编程】常见 Socket 地址结构

【1】IPv4套接字地址结构

struct sockaddr_in {

sa_family_t sin_family; /* AF_INET */

in_port_t sin_port; /* 端口号 */

struct in_addr sin_addr; /* 网络地址 */

/* 填充结构体空间与 `struct sockaddr' 大小一致 */

unsigned char sin_zero[sizeof (struct sockaddr) -

sizeof (sa_family_t) -

sizeof (in_port_t) -

sizeof (struct in_addr)];

};

typedef uint32_t in_addr_t;

struct in_addr {

in_addr_t s_addr; /* IPv4 地址 */

};

【2】IPv6套接字地址

struct sockaddr_in6 {

sa_family_t sin6_family; /* AF_INET6 */

in_port_t sin6_port; /* 传输层端口号 */

uint32_t sin6_flowinfo; /* IPv6 流信息 */

struct in6_addr sin6_addr; /* IPv6 地址 */

uint32_t sin6_scope_id; /* IPv6 域Id */

};

struct in6_addr { /* IPv6 地址结构体 */

union {

uint8_t u6_addr8[16];

uint16_t u6_addr16[8];

uint32_t u6_addr32[4];

} in6_u;

#define s6_addr in6_u.u6_addr8

#define s6_addr16 in6_u.u6_addr16

#define s6_addr32 in6_u.u6_addr32

};

【3】UNIX域套接字地址结构

struct sockaddr_un {

sa_family_t sun_family; //AF_LOCAL

char sun_path[ 104 ]; //路径名,必须以空字符结尾

}

【4】数据链路套接字地址结构

struct sockaddr_dl {

uint8_t sdl_len;

sa_family_t sdl_family; //AF_LINK

uint16_t sdl_index; //系统分配的索引

uint8_t sdl_type; //类型

uint8_t sdl_nlen; //名称长度,起始位置为 sdl_data[ 0 ]

uint8_t sdl_alen; //链路层地址长度

uint8_t sdl_slen; //链路层选择器长度

char sdl_data[ 12 ]; //最小的工作区间,内存大小可扩充,

//包含名字与链路层地址信息

}

【5】通用套接字地址结构

/* Structure large enough to hold any socket address

(with the historical exception of AF_UNIX). 128 bytes reserved. */

/* 该结构体足够大,能够容纳任何 socket 地址,预留 128 个字节 */

#if ULONG_MAX > 0xffffffff

# define __ss_aligntype __uint64_t

#else

# define __ss_aligntype __uint32_t

#endif

#define _SS_SIZE 128

#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_aligntype)))

struct sockaddr_storage

{

sa_family_t ss_family; /* Address family */

__ss_aligntype __ss_align; /* 强制对齐,Force desired alignment. */

char __ss_padding[_SS_PADSIZE];

};

【6】不同套接字地址结构体比较

5de4bef811a19e3a4b8dd5d1afd3bbd7.png

参考

本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】UNIX网络编程

【2】网络编程中4个重要的地址数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值