大多數套接口函數都需要一個指向套接口地址結構的指針作為參數。每個協議族都定義它自己的套接口地址結構。這些結構的名字均以“sockaddr_”開頭,并以對應每個協議族的唯一后綴結束。
ipv4套接口地址結構IPv4套接口地址結構通常也稱為”網際套接口地址結構“,它以”sockaddr_in“命名,定義在頭文件<netinet/in.h>中。其POSIX定義如下:
/* sockaddr_in */struct in_addr { in_addr_t s_addr; /* 23 bits IPv4 address */}; /* network byte ordered */struct sockaddr_in { uint8_t sin_len; /* length of structure(16) */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16-bit TCP or UDP port number */ /* network byte ordered */ struct in_addr sin_addr; /* 32-bit IPv4 address */ /* network byte ordered */ char sin_zero[8]; /* unused */};說明:
(1)除非涉及到路由套接口,否則對于長度成員sin_len,我們無需設置,也無需檢查。
(2)IPv4地址和TCP或UDP端口號在套接口地址結構中總是以網絡字節序來存儲,我們在使用這些成員時,必須牢記這一點。
(3)可以有兩種不同的方法來訪問32位IPv4地址。例如如果serv定義為網際套接口地址結構,那么serv.sin_addr給出的32位IPv4地址將是一個in_addr結構,而serv.sin_addr.s_addr給出的32位IPv4地址則是一個in_addr_t(通常是無符號的32位整數)。
(4)sin_zero成員暫不使用,但總是將它設置為0. 為方便起見,在初始化結構時,我們一般是將整個結構設置為0,而不僅僅是設置sin_zero成員為0. 雖然多數結構的使用不要求這一成員為0,但當捆綁一個非通配IPv4地址時,此成員必須為0.
(5)套接口地址結構僅在給定主機上使用:雖然結構中的某些成員(如IP地址和端口號)用在不同主機間的通信中,但結構本身并不參與通信。
通用套接口地址結構當作為參數傳遞給任一個套接口函數時,套接口地址結構總是通過指針來傳遞,但是,通過指針來取得此參數的套接口函數必須處理來自所支持的任何協議族的套接口地址結構。
有一個問題是如何聲明所傳指針的數據類型。ANSI C 中有很簡單的解決辦法:它有通用的指針類型void *。但是,套接口函數是在ANSI C 之前定義的。1982年采用了這一的一個辦法:在<sys/socket.h>頭文件中定義一個通用的套接口地址結構,如下:
/* sockaddr */struct sockaddr { uint8_t sa_len; sa_family_t sa_family; /* address family: AF_xxx value */ char sa_data[14]; /* PRotocol-specific address */};
于是,套接口函數被定義為采用指向通用套接口地址結構的指針。這就要求對這些函數的任何調用都必須將指向特定于協議的套接口地址結構的指針類型轉換成指向通用套接口地址結構的指針。
新聞熱點
疑難解答