前言
最近在看iOS核心開發(fā)手冊這本書,里面有一章講解關(guān)于網(wǎng)絡(luò)編程基礎(chǔ)的知識尤误,書中的幾個知識點概念理解的不是很明白稀轨,特此記錄一下以供參考運用。
地址族
套接口基本上可以理解為電話纹腌,有號碼(地址), 可以通信。用來傳輸數(shù)據(jù),也就是純粹的數(shù)據(jù)傳輸滞磺,而數(shù)據(jù)的接收(理解升薯,分析,聆聽)是依靠協(xié)議完成击困。
套接口在需要的時候創(chuàng)建覆劈,創(chuàng)建時主要需要指定的是域(domain),即所用的的地址族(AF_XXX沛励,如AF_IRDA)责语,類型和協(xié)議一般是固定的,SOCK_STREAM和0最常見目派。
綁定所用的通用地址族sockaddr:
#include <sys/socket.h>
struct sockaddr {
sa_family_t sa_family; /*地址族*/
char sa_data[14]; /*地址數(shù)據(jù)*/
};
sockaddr
- 下面詳細(xì)說明下sockaddr:
用于存儲參與(IP)Windows套接字通信的計算機(jī)上的一個internet協(xié)議(IP)地址坤候。為了統(tǒng)一地址結(jié)構(gòu)的表示方法 ,統(tǒng)一接口函數(shù)企蹭,使得不同的地址結(jié)構(gòu)可以被bind()白筹、connect()、recvfrom()谅摄、sendto()等函數(shù)調(diào)用徒河。但一般的編程中并不直接對此數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,而使用另一個與之等價的數(shù)據(jù)結(jié)構(gòu)sockaddr_in送漠。這是由于Microsoft TCP/IP套接字開發(fā)人員的工具箱僅支持internet地址字段顽照,而實際填充字段的每一部分則遵循sockaddr_in數(shù)據(jù)結(jié)構(gòu),兩者大小都是16字節(jié),所以二者之間可以進(jìn)行切換代兵。
其定義如下:
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family:是2字節(jié)的地址家族尼酿,一般都是“AF_xxx”的形式,它的值包括三種:AF_INET植影,AF_INET6和AF_UNSPE裳擎。
如果指定AF_INET,那么函數(shù)就不能返回任何IPV6相關(guān)的地址信息思币;如果僅指定了AF_INET6鹿响,則就不能返回任何IPV4地址信息。
AF_UNSPEC則意味著函數(shù)返回的是適用于指定主機(jī)名和服務(wù)名且適合任何協(xié)議族的地址谷饿。如果某個主機(jī)既有AAAA記錄(IPV6)地址惶我,同時又有A記錄(IPV4)地址,那么AAAA記錄將作為sockaddr_in6結(jié)構(gòu)返回各墨,而A記錄則作為sockaddr_in結(jié)構(gòu)返回。
通常用的都是AF_INET启涯。
如下舉例幾個:
- 本地地址族:AF_UNIX或AF_LOCAL:
#include <sys/un.h>
struct sockaddr_un {
sa_family_t sun_family; /*AF_UNIX*/
char sun_path[108]; /*地址數(shù)據(jù)*/
};
- 網(wǎng)絡(luò)地址族:AF_INET:
#include <netinet/in.h>
struct sockaddr_in {
sa_family_t sin_family; /* AF_INET */
uint16_t sin_port; /*端口號*/
struct in_addr sin_addr; /*Internet地址*/
unsigned char sin_zero[8] /*占位字節(jié)*/
};
- 紅外地址類:AF_IRDA:
#include <sys/types.h>
struct sockaddr_irda {
sa_family_t sir_family; /* AF_IRDA */
u_int8_t sir_lsap_sel; /* LSAP selector */
u_int32_t sir_addr; /* Device address */
char sir_name[25]; /*:IrDA:TinyTP ,OBEX,etc.*/
};
sockaddr_in
其定義如下:
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
sin_family:指代協(xié)議族贬堵,在socket編程中只能是AF_INET
sin_port:存儲端口號(使用網(wǎng)絡(luò)字節(jié)順序)
sin_addr:存儲IP地址,使用in_addr這個數(shù)據(jù)結(jié)構(gòu)
sin_zero:是為了讓sockaddr與sockaddr_in兩個數(shù)據(jù)結(jié)構(gòu)保持大小相同而保留的空字節(jié)结洼。