[开发资料] 网络通讯的结构与地址

[复制链接]
szt1993 发表于 2025-8-20 15:00 | 显示全部楼层 |阅读模式
1. 网络地址结构
Socket通过结构体描述网络地址,最常用的是IPv4地址结构sockaddr_in(定义在<netinet/in.h>):

  1. struct sockaddr_in {
  2.     sa_family_t     sin_family;   // 地址族:必须为AF_INET(IPv4)
  3.     in_port_t       sin_port;     // 端口号(网络字节序)
  4.     struct in_addr  sin_addr;     // IP地址(网络字节序)
  5.     unsigned char   sin_zero[8];  // 填充字段,必须为0(与sockaddr兼容)
  6. };

  7. struct in_addr {
  8.     in_addr_t s_addr;  // 32位IPv4地址(网络字节序)
  9. };
  10. 通用地址结构sockaddr(长度固定,用于函数参数统一):
  11. struct sockaddr {
  12.     sa_family_t sa_family;  // 地址族
  13.     char        sa_data[14]; // 地址数据(含端口+IP,长度可变)
  14. };

使用时需将sockaddr_in*强制转换为sockaddr*传给函数(如bind、connect)。
2. 字节序转换
网络中数据传输必须使用网络字节序(大端字节序),而主机可能是大端或小端(取决于CPU),因此需通过函数转换:

htons():主机字节序 → 网络字节序(16位,用于端口号)。
htonl():主机字节序 → 网络字节序(32位,用于IP地址)。
ntohs():网络字节序 → 主机字节序(16位)。
ntohl():网络字节序 → 主机字节序(32位)。
示例:将端口号8080转换为网络字节序:

uint16_t port = htons(8080); // 关键:端口必须转换,否则可能解析错误
3. IP地址转换
需将“点分十进制字符串”(如"192.168.1.1")与32位整数(网络字节序)互转:

推荐使用兼容IPv4/IPv6的函数:
inet_pton():字符串 → 网络字节序整数(presentation → network)。
inet_ntop():网络字节序整数 → 字符串(network → presentation)。
示例:

  1. struct sockaddr_in addr;
  2. // 字符串IP → 网络字节序
  3. inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
  4. // 网络字节序 → 字符串
  5. char ip_str[INET_ADDRSTRLEN]; // INET_ADDRSTRLEN:IPv4字符串最大长度(16)
  6. inet_ntop(AF_INET, &addr.sin_addr, ip_str, INET_ADDRSTRLEN);


小小蚂蚁举千斤 发表于 2025-8-21 23:24 | 显示全部楼层
网络通讯的结构与地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则

344

主题

2836

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部

344

主题

2836

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部