文章目录

  • 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

参考资料:

  1. C/C++从入门到精通-高级程序员之路【奇牛学院】

sockaddr数据结构相关推荐

  1. 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

     1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...

  2. linux的基础知识——网络字节序转化,ip地址转换函数,sockaddr数据结构

    1.网络字节序 TCP/IP协议规定,网络数据流采用大端字节序,即低地址高字节.为了使网络程序具有可移植性,使得同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机 ...

  3. 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分. 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小 ...

  4. TCP/IP,网络字节序与本地转换,Linux提供的转换函数htonl,htons等,sock_addr的数据结构与内容

    TCP/IP,网络字节序与本地转换,Linux提供的转换函数htonl,htons等,sock_addr的数据结构与内容 一.网络字节序存储方式: 小端存储:高位存放高地址,0x12345678的小段 ...

  5. sockaddr地址结构——socket

    sockaddr地址结构 bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 像bind这些函数API在很 ...

  6. socket编程和并发服务器

    socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socke ...

  7. Linux之socket套接字编程20160704

    介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...

  8. 套接字编程--TCP

    一.socket编程 socket本身有"插座"的意思,因此用来描述网络连接的一对一关系."在TCP/IP协议中,"TP地址+TCP或端口号"唯一标识 ...

  9. Linux--网络编程

    1.Linux的优点之一就是在于它丰富而稳定的网络协议栈,其范围是从协议无关层(如通用的socket层接口和设备层)到各种网络协议的实现 2.对于网络理论介绍一般采用OSI模型,但是Linux中网络栈 ...

最新文章

  1. 《Android 开发入门与实战(第二版)》——6.6节配置改变
  2. [转载] 七龙珠第一部——第032话 飞天要塞
  3. 基于R语言构建的电影评分预测模型
  4. python开发好学吗-Python的前景和Python好不好学呢?
  5. cordova 发布 android release 签名打包
  6. 怎么样从一个疯狂下载者成为一个学习者
  7. .NET6之MiniAPI(十三):健康检查
  8. oracle查询当前用户名下所有表
  9. aspen怎么做灵敏度分析_不会敲代码怎么做智能分析?用奥威商业智能BI
  10. 王者荣耀回应服务器崩了:已处理完成 将陆续补发相应赔偿
  11. struts2 自带的 token防止表单重复提交拦截器
  12. Tensorflow——Tensorflow的用途、安装、数据流图
  13. 织梦自定义表单限制IP24小时只能提交一次方法
  14. Juniper路由器基本命令及中文解
  15. 联发科MT6139射频处理器工作原理分析
  16. 【Java虚拟机】第一章、Java虚拟机是如何产生的
  17. ACA-PEG-MAL,丙烯酰胺PEG马来酰亚胺
  18. nokia 诺基亚nth主题说明
  19. 2022-2028年中国物流地产行业市场发展潜力及投资风险预测报告
  20. 1079 日K蜡烛图

热门文章

  1. PCB 零件尺寸图:Arduino Mega 2560 尺寸
  2. stm32f407 usb cdc设备无法启动问题
  3. c标准基本库函数:libc、glibc的关系
  4. 随机接入响应(RAR,即MSG2)发送过程
  5. ESP32的FLASH、NVS、SPIFFS、OTA等存储分布以及启动过程
  6. 爱国者强烈推荐:nanopiR1——你懂的功能,懂你的开发板
  7. AI+云 华为开启智能时代新纪元
  8. dotweb——go语言的一个微型web框架(二)启动dotweb
  9. Bzoj4817:[SDOI2017]树点涂色
  10. Codeforces 757C - Felicity is Coming!