标签:
在套接字编程中,有三种常见的结构类型,他们用来存放socket地址信息。这三种结构分别是struct in_addr、struct sockaddr、struct sockaddr_in。
1)struct in_addr专门用来存储IP地址,对于IPv4来说,IP地址为32位无符号整数。其定义如下:
struct in_addr { unsigned long s_addr; }
2)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结构类型。
3)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 一样大小) */ };
在实际编程中,对套接字地址结构使用方法和流程如下:
A. 首先,定义一个sockaddr_in结构变量,并将它初始化为0,代码如下:
struct sockaddr_in myad; memset(&myad, 0, sizeof(myad));
B. 然后,给这个结构变量赋值,代码如下:
myad.sin_family = AF_INET; myad.sin_port = htons(8080); myad.sin_addr.s_addr = htonl(INADDR_ANY);
C. 在进行函数调用时,将这个结构强制转换为struct sockaddr类型,代码如下:
bind(serverFd, (struct sockaddr *) &myad, sizeof(myad));
标签:
原文地址:http://www.cnblogs.com/xiehongfeng100/p/4597803.html