在建立socket通信的过程中地址起着很关键的作用,在设计TCP/IP网络程序时,必须对 socket 的地址结构有清晰的认识。
TCP/IP 的地址数据结构。
struct sockaddr {
u_short safamily;/*地址族,AF_XXX*/
char sa_data[14];/*14字节的特定协议地址*/
}
其中14字节的sa_data随协议而不同。在TCP/IP协议族中,地址数据结构为:
struct in_addr{
u_long s_addr;/*32比特的IP地址,网络字节顺序 */
};
struct sockaddr_in{
short sin_family; /*AF_INET*/
u_short sin_short; /*16比特的端口号,网络字节顺序*/
struct in_addr sin_addr; /*32比特的IP地址,网络字节顺序*/
char sin_zero[8]; /*未用*/
}
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。由主机字节顺序转换为网络字节顺序的两个函数如下:htons():将16比特的主机字节顺序数据转换为网络字节顺序htonl():将32比特的主机字节顺序数据转换为网络字节顺序与此相对应的将网络字节顺序转换为主机字节顺序的函数为:
ntohs():将16比特的网络字节顺序数据转换为主机字节顺序ntohl():将32比特的网络字节顺序数据转换为主机字节顺序由于各种socket地址结构的长度相差很大,TCP/IP地址族的地址长度为8字节,XNS地址为14字节,UNIX地址不定,最长可达110字节,所以无法以一种统一的格式定义它们,需要在bind()调用中明确指定socket地址的长度。
当bind()参数无效或端口已被其他程序所用时,函数返回-1,表明本次socket命名失败。