?第6章地址家族和名字解析
?
?要通過Wi n s o c k建立通信,必須了解如何利用指定的協議為工作站定址。本章將一一說明Wi n s o c k支持的協議以及各協議如何把一個指定家族的地址解析成網絡上一臺具體的機器。
6.1 IP
網際協議( Internet Protocol, IP)是一種用于互聯網的網絡協議.
從它的設計看來, I P是一個無連接的協議,不能保證數據投遞萬
無一失。兩個比它高級的協議( T C P和U D P)用于依賴I P協議的數據通信。
6.1.1 TCP
面向連接的通信是通過“傳輸控制協議”(Transmission Control Protocol, TCP)來完成的。
T C P提供兩臺計算機之間的可靠無錯的數據傳輸。應用程序利用T C P進行通信時,源和目標之間會建立一個虛擬連接。這個連接一旦建立,兩臺計算機之間就可以把數據當作一個雙向字節流進行交換。
6.1.2 UDP
無連接通信是通過“用戶數據報協議”(User Datagram Protocol, UDP)來完成的。U D P不保障可靠數據的傳輸,但能夠向若干個目標發送數據,接收發自若干個源的數據。
數據傳輸方法采用的是數據報。
T C P和U D P兩者都利用I P來進行數據傳輸,一般稱為T C P / I P和U D P / I P。Wi n s o c k通過A F _ I N E T地址家族為I P通信定址,
6.1.3 定址
Wi n s o c k中,應用通過S O C K A D D R _ I N結構來指定I P地址和服務端口信息,該結構的格式如下:
struct sockaddr_in
{
?short ?sin_family;
?u_short sin_port;
?struct in_addr sin_addr;
?char??? sin_zero[8];
}
。從本質上說,端口號分為下面這三類:“已知”端口、已注冊端口、動態和(或)私用端口。
■ 0 ~ 1 0 2 3由I A N A控制,是為固定服務保留的。
■ 1 0 2 4 ~ 4 9 1 5 1是I A N A列出來的、已注冊的端口,供普通用戶的普通用戶進程或程序使
用。
■ 4 9 1 5 2 ~ 6 5 5 3 5是動態和(或)私用端口。
普通用戶應用應該選擇1 0 2 4 ~ 4 9 1 5 1之間的已注冊端口,
S O C K A D D R _ I N結構的s i n _ a d d r字段用于把一個I P地址保存為一個4字節的數,它是無符號長整數類型。根據這個字段的不同用法,還可表示一個本地或遠程I P地址。I P地址一般是
用“互聯網標準點分表示法”(像a . b . c . d一樣)指定的,每個字母代表一個字節數,從左到右分配一個4字節的無符號長整數。最后一個字段sin_ zero ,只充當填充項的職責,以使S O C K A D D R _ I N結構和S O C K A D D R結構的長度一樣。
一個有用的、名為i n e t _ a d d r的支持函數,可把一個點式I P地址轉換成一個3 2位的無符號長整數。它的定義如下:
unsigned long inet_addr(
const char FAR *cp
);
這個函數把I P地址當作一個按網絡字節順序排列的3 2位無符號長整數返回
1. 特殊地址
對于特定情況下的套接字行為,有兩個特殊I P 地址可對它們產生影響。特殊地址I N A D D R _ A N Y允許服務器應用監聽主機計算機上面每個網絡接口上的客戶機活動。一般情況下,在該地址綁定套接字和本地接口時,網絡應用才利用這個地址來監聽連接。如果你有一個多址系統,這個地址就允許一個獨立應用接受發自多個接口的回應。特殊地址I N A D D R _ B R O A D C A S T用于在一個I P網絡中發送廣播U D P數據報。要使用這個特殊地址,需要應用設置套接字選項S O _ B R O A D C A S T。
2. 字節排序
針對“大頭”(b i g - e n d i a n)和“小頭”(l i t t l e - e n d i a n)形式的編號,不同的計算機處理器的表示方法有所不同,這由各自的設計決定。比如, Intel 86處理器上,用“小頭”形式來表示多字節編號:字節的排序是從最無意義的字節到最有意義的字節。在計算機中把I P地址和端口號指定成多字節數時,這個數就按“主機字節”(h o s t - b y t e)順序來表示。但是,如果在網絡上指定I P地址和端口號,“互聯網聯網標準”指定多字節值必須用“大頭”形式來表示
(從最有意義的字節到最無意義的字節),一般稱之為“網絡字節”(n e t w o r k - b y t e)順序。
我們打算演示一下如何利用上面描述的i n e t _ a d d r 和h t o n s 函數來創建
S O C K A D D R _ I N結構。
SOCKETADDR_IN?InternetAddr;
int nPortId = 5150;
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = inet_addr("198.198.10.216");
InternetAddr.sin_port = htonl(nPortId);
6.1.4 創建套接字
創建一個I P套接字的好處是便于應用能夠通過T C P、U D P和I P協議進行通信。如要用T C P協議打開一個I P套接字,需調用帶有地址家族A F _ I N E T和套接字類型S O C K _ S T R E A M的s o c k e t函數或W S A S o c k e t函數,并把協議字段設成0,方式如下:
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,0);
s = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
要利用U D P協議打開I P套接字,只須指定套接字類型,用這個指定的套接字類型代替s o c k e t函數中的S O C K _ S T R E A M和上面的W S A S o c k e t調用。還可以打開一個套接字通過I P直接通信。這是把套接字類型設成S O C K _ R AW來完成的。
6.1.5 名字解析
Wi n s o c k應用打算通過I P和主機通信時,必須知道這個主機的I P地址。依用戶看來, I P地址是不容易記的。在指定機器時,許多人更愿意利用一個易記的、友好的主機名而不是I P地址。Wi n s o c k提供了兩個支持函數,它們有助于用戶把一個主機名解析成I P地址。
Wi n d o w s套接字g e t h o s t b y n a m e和WSAAsynGetHostByName API函數從主機數據庫中取回與指定的主機名對應的主機信息。兩個函數均返回一個H O S T E N T結構.
6.3 IPX/SPX
“互聯網包交換”(I P X)協議是一個常見協議,一般為承擔Novell NetWa r e客戶機/服務器聯網服務的計算機所用。。I P X提供兩個進程間的無連接通信;因此,如果一個工作站發出一個數據包,該協議無法保證這個數據包會準確無誤地投遞到目標地點。如果應用程序需要數據投遞保證,但仍堅持使用I P X,它就會選用一個比I P X高級的協議,比如說“順序分組交換”
(S P X)和SPX II協議,這兩個協議中, S P X包通過I P X發送。Wi n s o c k為應用程序提供了在Wi n d o w s平臺上通過I P X進行通信的能力(它們是Windows 95、Windows 98、Windows NT以及Windows 2000)
6.6 ATM
異步傳輸模式(AT M)協議是目前已有的最新協議之一, Windows 98和Windows 2000平臺上的Winsock 2均支持它。AT M通常用于L A N和WA N上的高速聯網,也用于各種類型的通信,比如說要求高速通信的語音、視頻和數據等。一般說來, AT M利用網絡上的虛擬連接(V C)來提供服務質量( Q O S)保證。正如大家即將看到的那樣,Wi n s o c k能夠通過AT M地址家族來使用AT M網絡上的虛擬連接。AT M網絡(如圖6 - 1所示)一般由通過交換機(它們將
AT M網絡橋接在一起)連接的端點(或計算機)構成。
針對AT M協議編程時,需要明白這幾點。首先, AT M是一個媒體類型,而不是一個真正的協議。也就是說, AT M類似于直接在以太網上寫入以太幀。和以太網一樣, AT M協議沒有提供流控制。它是一個面向連接的協議,要么提供消息模式,要么提供流模式。這還意味著如果數據不能快速發送出去,發送應用則可能溢出本地緩沖。同樣地,接收應用必須頻繁投遞收到的數據:否則,接收緩沖填滿之時,任何一個另外接入的數據都可能被丟棄。如果你的應用需要流控制,方法之一是在AT M上使用I P協議(它只是運行于AT M網絡上的I P協議)。
這樣一來,應用便緊跟在上面描述的I P地址家族之后。當然, AT M的確提供了比I P好的一些好處,比如說“根式多播方案”(第1 2章將對此進行說明);然而,要根據自己的應用需要來決定最適合你的那種協議。
6.8 小結
這一章論述了Wi n s o c k支持的協議地址家族,說明了各個家族特有的定址屬性。針對每個地址家族,我們還討論了如何創建套接字和如何設置套接字地址結構,以便開始通過協議進行通信。下一章,我們將描述適用于Wi n s o c k的基本通信技術,并把它們應用到本章討論的所有地址家族上。