存储套接字地址
点击(此处)折叠或打开
- struct sockaddr
- {
- unsigned short sa_family; /*address族*/
- char sa_data[14]; /*14bytes的协议地址*/
- }
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_ntoa:
打印IP地址(以数字加点的形式),如
点击(此处)折叠或打开
- struct sockaddr_in pSock;
- char *p;
- p = inet_ntoa(pSock.sin_addr);
- printf("%s\n",p);