sockaddr数据结构
文章目錄
- 1 sockaddr數(shù)據(jù)結(jié)構(gòu)
- 1.1 sockaddr數(shù)據(jù)結(jié)構(gòu)詳解
- 1.2 地址族字段詳解
1 sockaddr數(shù)據(jù)結(jié)構(gòu)
1.1 sockaddr數(shù)據(jù)結(jié)構(gòu)詳解
很多網(wǎng)絡(luò)編程函數(shù)誕生早于IPv4協(xié)議,那時(shí)候都使用的是sockaddr結(jié)構(gòu)體,為了向前兼容,現(xiàn)在sockaddr退化成了(void *)的作用,傳遞一個(gè)地址給函數(shù),至于這個(gè)函數(shù)是sockaddr_in還是其他的,由地址族確定,然后函數(shù)內(nèi)部再?gòu)?qiáng)制類型轉(zhuǎn)化為所需的地址類型。
通用套接字地址格式:
/* POSIX.1g 規(guī)范規(guī)定了地址族為2字節(jié)的值. */ 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 *//* 這里僅僅用作占位符,不做實(shí)際用處 */unsigned char sin_zero[8]; };IPv4的地址格式定義在netinet/in.h中,IPv4地址用sockaddr_in結(jié)構(gòu)體表示,包括16位端口號(hào)和32位IP地址,但是sock API的實(shí)現(xiàn)早于ANSI C標(biāo)準(zhǔn)化,那時(shí)還沒有void *類型,因此這些像bind 、accept函數(shù)的參數(shù)都用struct sockaddr *類型表示,在傳遞參數(shù)之前要強(qiáng)制類型轉(zhuǎn)換一下,例如:
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; /* 傳輸端口號(hào) # 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 */ };整個(gè)結(jié)構(gòu)體長(zhǎng)度是 28 個(gè)字節(jié),其中流控信息和域 ID 先不用管,這兩個(gè)字段,一個(gè)在 glibc 的官網(wǎng)上根本沒出現(xiàn),另一個(gè)是當(dāng)前未使用的字段。這里的地址族顯然應(yīng)該是 AF_INET6,端口同 IPv4 地址一樣,關(guān)鍵的地址從 32 位升級(jí)到 128 位,這個(gè)數(shù)字就大到恐怖了,完全解決了尋址數(shù)字不夠的問(wèn)題。
本地套接字地址格式:
struct sockaddr_un {unsigned short sun_family; /* 固定為 AF_LOCAL */char sun_path[108]; /* 路徑名 */ };各種套接字對(duì)比分析:
1.2 地址族字段詳解
地址族字段,它表示使用什么樣的方式對(duì)地址進(jìn)行解釋和保存。地址族在 glibc 里的定義非常多,常用的有以下幾種:
- AF_LOCAL:表示的是本地地址,對(duì)應(yīng)的是 Unix 套接字,這種情況一般用于本地 socket 通信,很多情況下也可以寫成 AF_UNIX、AF_FILE;
- AF_INET:因特網(wǎng)使用的 IPv4 地址;
- AF_INET6:因特網(wǎng)使用的 IPv6 地址。
這里的 AF_ 表示的含義是 Address Family,但是很多情況下,我們也會(huì)看到以 PF_ 表示的宏,比如 PF_INET、PF_INET6 等,實(shí)際上 PF_ 的意思是 Protocol Family,也就是協(xié)議族的意思。我們用 AF_xxx 這樣的值來(lái)初始化 socket 地址,用 PF_xxx 這樣的值來(lái)初始化 socket。我們?cè)?<sys/socket.h> 頭文件中可以清晰地看到,這兩個(gè)值本身就是一一對(duì)應(yīng)的。
/* 各種地址族的宏定義 */ #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參考資料:
總結(jié)
以上是生活随笔為你收集整理的sockaddr数据结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 比利时RL-83反坦克火箭筒
- 下一篇: Makefile实例分析