1、struct sockaddr 存储套接字地址
- struct sockaddr
- {
- unsigned short sa_family; /*address族*/
- char sa_data[14]; /*14bytes的协议地址*/
- }
其中sa_family一般为AF_INET,sa_data包括了主机的地址、端口等信息。
2、struct sockaddr_in sockaddr_in是sockaddr的替代品,sin_family相当于sockaddr中的sa_family,sin_addr和sin_port必须是网络字节顺序的。
- struct sockaddr_in
- {
- short int sin_family; /*Internet地址族*/
- unsigned short int sin_port; /*端口号*/
- struct in_addr sin_addr; /*Internet地址*/
- unsigned char sin_zero[8]; /*添0操作,目的是和struct sockaddr一样大小,可以通过bzero或memset实现*/
- }
3、struct in_addr- struct in_addr
- {
- unsigned long s_addr;
- }
4、网络字节序 vs 主机字节序 主机字节序是指机器内部对变量的字节存储顺序,有的机器是高位在前,有的则是低位在前。而网络传输要求大家的数据顺序是统一的。因此就需要进行字节序的转换。除此之外,转换的另一个好处是易于移植程序。
相关转换函数: ('h':Host、'n':Network、's':Short、'l':Long)
htons: 主机字节序转换为网络字节序(对无符号短整型,4bytes)
htonl: 主机字节序转换为网络字节序(对无符号长整型,8bytes)
ntohs: 网络字节序转换为主机字节序(对无符号短整型,4bytes)
ntohl: 网络字节序转换为主机字节序(对无符号长整型,8bytes)
5、IP地址转换函数 inet_addr:
能将用数字和点表示的IP地址转换成一个无符号长整型,如
- struct sockaddr_in pSock;
- pSock.sin_addr.s_addr = inet_addr("192.168.18.100");
inet_addr返回的已经是网络字节序了,没必要再进行转换。
inet_ntoa:
打印IP地址(以数字加点的形式),如
- struct sockaddr_in pSock;
- char *p;
- p = inet_ntoa(pSock.sin_addr);
- printf("%s\n",p);
阅读(2867) | 评论(0) | 转发(4) |