一、通用 socket 地址结构
socket 网络编程接口中表示 socket 地址的是结构体 sockaddr,其定义如下:
1. #include <bits/socket.h>
2.
3. struct sockaddr
4. {
5. sa_family_t sa_family;
6. char sa_data[14];
7. };
sa_family 成员是地址族类型(sa_family_t)的变量。
地址族类型通常与协议族类型对应。常见的协议族和对应的地址族如下图所示:
二、专用 socket 地址结构
TCP/IP 协议族有 sockaddr_in 和 sockaddr_in6 两个专用 socket 地址结构体,它们分
别用于 IPV4 和 IPV6:
1. /*
2. sin_family: 地址族 AF_INET
3. sin_port: 端口号,需要用网络字节序表示
4. sin_addr: IPV4 地址结构:s_addr 以网络字节序表示 IPV4 地址
5. */
6.
7. struct in_addr
8. {
9. u_int32_t s_addr;
10. };
11.
12. struct sockaddr_in
13. {
14. sa_family_t sin_family;
15. u_int16_t sin_port;
16. struct in_addr sin_addr;
17. };
18.
19. struct in6_addr
20. {
21. unsigned char sa_addr[16]; // IPV6 地址,要用网络字节序表示
22. };
23.
24. struct sockaddr_in6
25. {
26. sa_family_t sin6_family; // 地址族:AF_INET6
27. u_inet16_t sin6_port; // 端口号:用网络字节序表示
28. u_int32_t sin6_flowinfo; // 流信息,应设置为 0
29. struct in6_addr sin6_addr; // IPV6 地址结构体
30. u_int32_t sin6_scope_id; // scope ID,尚处于试验阶段
31. };
三、IP 地址转换函数
通常,人们习惯用点分十进制字符串表示 IPV4 地址,但编程中我们需要先把它们转化为整数方能使用。
下面函数可用于点分十进制字符串表示的 IPV4 地址和网络字节序整数表 示的 IPV4 地址之间的转换:
1. #include <arpa/inet.h>
2. in_addr_t inet_addr(const char *cp); //字符串表示的 IPV4 地址转化为网络字节序
3. char* inet_ntoa(struct in_addr in); // IPV4 地址的网络字节序转化为字符串表示