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