typedef unsigned short sa_family_t;struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */}
- sockaddr_in Internet的socket地址
/* Structure describing an Internet socket address. */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)]; /* 字元數組sin_zero[8]的存在是為了保證結構體struct sockaddr_in的大小和結構體struct sockaddr的大小相等 */};struct in_addr {unit32_t s_addr; /* Internet address */};
- sockaddr_un Unix系統的socket地址
struct sockaddr_un { sa_family_t sun_family; /*PF_UNIX或AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* 路徑名 */ };
在一般的x86架構的PC中採用的是小端模式儲存資料,而對於socket中所需要的是大端模式因而需要進行相關的轉換。一般的轉換函式有
ntohl將網路32位位元組資料轉換為主機資料
ntohs將網路16位位元組資料轉換為主機資料
htonl將主機32位位元組資料轉換為網路資料
htons將網路16位位元組資料轉換為網路資料
inet_ntoa將網路位元組的ip地址轉換為十進位點分地址
inet_aton將點分十進位地址轉換為網路位元組的ip地址
inet_network將點分十進位轉換為主機位元組的32位元據
一般網路編程填值的時候使用sockaddr_in結構,而作為函數的參數傳入的時候轉換成sockaddr結構,都是16個字元長。