- linux socket中三种地址
- sockaddr普通的socket地址
typedef unsigned short sa_family_t; struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ }
- sockaddr_in Internet的socket地址
/* Structure describing an Internet socket address. */ struct sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; /* 字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等 */ }; struct in_addr { unit32_t s_addr; /* Internet address */ };
- sockaddr_un Unix系统的socket地址
struct sockaddr_un { sa_family_t sun_family; /*PF_UNIX或AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* 路径名 */ };
- linux socket中的地址转换
在一般的x86架构的PC中采用的是小端模式存储数据,而对于socket中所需要的是大端模式因而需要进行相关的转换。一般的转换函数有
- socket通用转换函数
ntohl将网络32位字节数据转换为主机数据ntohs将网络16位字节数据转换为主机数据htonl将主机32位字节数据转换为网络数据htons将网络16位字节数据转换为网络数据
- inet转换函数
inet_ntoa将网络字节的ip地址转换为十进制点分地址inet_aton将点分十进制地址转换为网络字节的ip地址inet_network将点分十进制转换为主机字节的32位数据
- 总结
一般网络编程填值的时候使用sockaddr_in结构,而作为函数的参数传入的时候转换成sockaddr结构,都是16个字符长。