以sockaddr_in命名在<netinet/in.h>头文件中, POSIX定义如下:
struct in_addr { in_addr_t s_addr; // 32-bit IPv4 address }; struct sockaddr_in { uint8_t sin_len; // length of structure (16) sa_family_t sin_family; //AF_INET,8-bit in_port_t sin_port; //16-bit TCP or UDP port number struct in_addr sin_addr; //32-bit IPv4 address char sin_zero[8]; //unused };而ubuntu系统上的IPv4套接字结构和书中的有些不同哦,如下:
/*__SOCKADDR_COMMON 宏定义 bits/sockaddr.h*/ #define __SOCKADDR_COMMON(sa_prefix) \ sa_family_t sa_prefix##family #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int)) /************************************************************/ /* /usr/include/netinet/in.h */ struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { __SOCKADDR_COMMON (sin_); /*宏定义*/ in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; };下面这一段为宏定义:
#define __SOCKADDR_COMMON(sa_prefix) \ sa_family_t sa_prefix##family其中,##为连接符,连接前后两个字符串,没有再扩展特性,详见宏定义,即__SOCKADDR_COMMON(sin_);相当于sa_family_t sin_family; 此外,ubuntu系统的套接字结构并没有sin_len成员变量, 为了保持套接字长度一致, sa_family_t 类型变量长度为16位