1. 三种常见结构类型
在套接字编程编程中,有三种常见的结构类型,它们用来存放socket地址信息。这三种结构类型分别为struct in_addr、struct sockaddr、struct sockaddr_in,对这三种结构类型说明如下。
struct in_addr专门用来存储IP地址,对于IPv4来说,IP地址为32位无符号整数。其定义如下:
struct in_addr {
unsigned long s_addr;
};
struct sockaddr结构用来保存套接字地址信息,其定义如下:
struct sockaddr {
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14字节的协议地址*/
};
struct sockaddr结构中sa_family成员说明的是地址族类型,一般为“AF_INET”;而sa_data则包含远程主机的IP地址和端口等信息。
struct sockaddr结构类型使用在socket的相关系统调用函数中,但这个结构sa_data字段可以包含较多信息,不利于方便编程和对其进行赋值,因此建立了struct sockaddr_in结构,该结构与struct sockaddr结构大小相等,能更好处理struct sockaddr结构中的数据。对struct sockaddr_in结构变量进行赋值完成后,在进行socket相关系统调用时,再将struct sockaddr_in结构变量强制转换为struct sockaddr结构类型。
struct sockaddr_in结构定义如下:
struct sockaddr_in { /*“in” 代表“Internet”*/
short int sin_family; /* Internet地址族*/
unsigned short int sin_port; /* 端口号*/
struct in_addr sin_addr; /* Internet地址*/
unsigned char sin_zero[8]; /* 填充0(为了保持和struct sockaddr一样大小)*/
};
在实际应用编程中,对套接字地址结构使用方法和流程如下:
① 首先,定义一个sockaddr_in结构变量,并将它初始化为0,代码如下:
struct sockaddr_in myad;
memset(&myad,0,sizeof(struct sockaddr_in));
② 然后,给这个结构变量赋值,代码如下:
myad.sin_family=AF_INET;
myad.sin_port=htons(8080);
myad.sin_addr.s_addr=htonl(INADDR_ANY);
③ 在进行函数调用时,将这个结构强制转换为struct sockaddr类型,代码如下:
bind(serverFd, (struct sockaddr *)& myad, sizeof(myad))
2. 整型字节序转换函数
为保证“大端”和“小端”字节序的机器之间能相互通信,需在发送多字节整数时,将主机字节序转换成网络字节序,或将网络字节序转换为主机字节序。下图说明了网络字节序与小端字节序、大端字节序的对照关系。字节转换主要是针对整型进行转换,字符型由于是单字节,所以不存在这个问题。整型字节序转换函数函数原型及其说明如下表所示。
所需头文件 |
#include <netinet/in.h> |
函数说明 |
完成网络字节序与主机字节序的转换 |