sockaddr数据结构
文章目錄
- 1 sockaddr數據結構
- 1.1 sockaddr數據結構詳解
- 1.2 地址族字段詳解
 
 
1 sockaddr數據結構
1.1 sockaddr數據結構詳解
很多網絡編程函數誕生早于IPv4協議,那時候都使用的是sockaddr結構體,為了向前兼容,現在sockaddr退化成了(void *)的作用,傳遞一個地址給函數,至于這個函數是sockaddr_in還是其他的,由地址族確定,然后函數內部再強制類型轉化為所需的地址類型。
通用套接字地址格式:
/* POSIX.1g 規范規定了地址族為2字節的值. */ typedef unsigned short int sa_family_t; /* 描述通用套接字地址 */ struct sockaddr{sa_family_t sa_family; /* 地址族. 16-bit*/char sa_data[14]; /* 具體的地址值 112-bit */ };IPv4 套接字格式地址:
/* IPV4套接字地址,32bit值. */ typedef uint32_t in_addr_t; struct in_addr {in_addr_t s_addr; };/* 描述IPV4的套接字地址格式 */ struct sockaddr_in {sa_family_t sin_family; /* 16-bit */in_port_t sin_port; /* 端口口 16-bit*/struct in_addr sin_addr; /* Internet address. 32-bit *//* 這里僅僅用作占位符,不做實際用處 */unsigned char sin_zero[8]; };IPv4的地址格式定義在netinet/in.h中,IPv4地址用sockaddr_in結構體表示,包括16位端口號和32位IP地址,但是sock API的實現早于ANSI C標準化,那時還沒有void *類型,因此這些像bind 、accept函數的參數都用struct sockaddr *類型表示,在傳遞參數之前要強制類型轉換一下,例如:
struct sockaddr_in servaddr; bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr)); /* initialize servaddr */IPv6 套接字地址格式:
struct sockaddr_in6 {sa_family_t sin6_family; /* 16-bit */in_port_t sin6_port; /* 傳輸端口號 # 16-bit */uint32_t sin6_flowinfo; /* IPv6流控信息 32-bit*/struct in6_addr sin6_addr; /* IPv6地址128-bit */uint32_t sin6_scope_id; /* IPv6域ID 32-bit */ };整個結構體長度是 28 個字節,其中流控信息和域 ID 先不用管,這兩個字段,一個在 glibc 的官網上根本沒出現,另一個是當前未使用的字段。這里的地址族顯然應該是 AF_INET6,端口同 IPv4 地址一樣,關鍵的地址從 32 位升級到 128 位,這個數字就大到恐怖了,完全解決了尋址數字不夠的問題。
本地套接字地址格式:
struct sockaddr_un {unsigned short sun_family; /* 固定為 AF_LOCAL */char sun_path[108]; /* 路徑名 */ };各種套接字對比分析:
1.2 地址族字段詳解
地址族字段,它表示使用什么樣的方式對地址進行解釋和保存。地址族在 glibc 里的定義非常多,常用的有以下幾種:
- AF_LOCAL:表示的是本地地址,對應的是 Unix 套接字,這種情況一般用于本地 socket 通信,很多情況下也可以寫成 AF_UNIX、AF_FILE;
- AF_INET:因特網使用的 IPv4 地址;
- AF_INET6:因特網使用的 IPv6 地址。
這里的 AF_ 表示的含義是 Address Family,但是很多情況下,我們也會看到以 PF_ 表示的宏,比如 PF_INET、PF_INET6 等,實際上 PF_ 的意思是 Protocol Family,也就是協議族的意思。我們用 AF_xxx 這樣的值來初始化 socket 地址,用 PF_xxx 這樣的值來初始化 socket。我們在 <sys/socket.h> 頭文件中可以清晰地看到,這兩個值本身就是一一對應的。
/* 各種地址族的宏定義 */ #define AF_UNSPEC PF_UNSPEC #define AF_LOCAL PF_LOCAL #define AF_UNIX PF_UNIX #define AF_FILE PF_FILE #define AF_INET PF_INET #define AF_AX25 PF_AX25 #define AF_IPX PF_IPX #define AF_APPLETALK PF_APPLETALK #define AF_NETROM PF_NETROM #define AF_BRIDGE PF_BRIDGE #define AF_ATMPVC PF_ATMPVC #define AF_X25 PF_X25 #define AF_INET6 PF_INET6參考資料:
總結
以上是生活随笔為你收集整理的sockaddr数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 比利时RL-83反坦克火箭筒
- 下一篇: Makefile实例分析
