劉鐘濤 申 康
關(guān)鍵詞:Socket;數(shù)字圖書(shū)館;代理服務(wù)器
摘 要:數(shù)字圖書(shū)館的實(shí)現(xiàn)以網(wǎng)絡(luò)編程為基礎(chǔ),Socket是TCP/IP協(xié)議的接口,服務(wù)器和客戶(hù)端利用Socket建立了多個(gè)數(shù)據(jù)傳輸通道,提出了TCP/IP協(xié)議下Socket并發(fā)通信的過(guò)程和方法,從而實(shí)現(xiàn)數(shù)據(jù)的并發(fā)傳輸。中圖分類(lèi)號(hào):G250.76文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1003-1588(2009)04-0079-03
1 Socket的概念
TCP/IP協(xié)議(Transmission Control Protocol/Internet Protocol)叫做傳輸控制/網(wǎng)際協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)。 TCP/IP是用于計(jì)算機(jī)通信的一組協(xié)議,我們通常稱(chēng)它為T(mén)CP/IP協(xié)議族,TCP/IP為網(wǎng)絡(luò)的應(yīng)用服務(wù)互聯(lián)和共享提供了有效的手段,Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來(lái)開(kāi)發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。應(yīng)用程序通常通過(guò)“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求,Internet網(wǎng)絡(luò)的編程必須使用Socket接口。是通信的基石,是支持TCP/IP網(wǎng)絡(luò)通訊協(xié)議的基本操作單元,所謂Socket通常也稱(chēng)作“套接字”,可以將套接字看作不同主機(jī)間進(jìn)程進(jìn)行雙向通信的端點(diǎn),它構(gòu)成了整個(gè)網(wǎng)絡(luò)的編程界面(如圖1)。
從用戶(hù)的角度來(lái)看套接字是通信端點(diǎn)的抽象概念,它為用戶(hù)提供了發(fā)送和接受數(shù)據(jù)的機(jī)制,Socket用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過(guò)“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。其中應(yīng)用程序告訴Socket執(zhí)行什么任務(wù),Socket將這些命令翻譯成TCP/IP協(xié)議的通信語(yǔ)言,再通過(guò)和TCP/IP進(jìn)行交流,最后由TCP/IP協(xié)議將其傳送到網(wǎng)絡(luò)進(jìn)行網(wǎng)絡(luò)通信。
2 數(shù)字圖書(shū)館通信原理
作為網(wǎng)絡(luò)上公認(rèn)的通信標(biāo)準(zhǔn),TCP/IP協(xié)議成為網(wǎng)絡(luò)編程實(shí)現(xiàn)網(wǎng)絡(luò)通信的重要組成部分。首先在服務(wù)器與客戶(hù)端之間定義TCP通信協(xié)議,并創(chuàng)建Socket套接字,利用該套接字建議一套可靠的、基于面向連接的通信接口,客戶(hù)端和服務(wù)器在該連接上傳輸數(shù)據(jù),客戶(hù)端發(fā)送請(qǐng)求,服務(wù)器監(jiān)聽(tīng)來(lái)自客戶(hù)的請(qǐng)求,并作出響應(yīng)服務(wù)。
Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多的函數(shù)和例程。目前,網(wǎng)絡(luò)上絕大多數(shù)的通信采用的都是服務(wù)器/客戶(hù)端(Server/Client)機(jī)制,一般情況下,在服務(wù)器端,當(dāng)有一個(gè)客戶(hù)端連接請(qǐng)求到來(lái)時(shí),服務(wù)器與客戶(hù)端建立連接,然后服務(wù)器端一個(gè)進(jìn)程專(zhuān)門(mén)處理與客戶(hù)端的通信,子進(jìn)程為客戶(hù)提供服務(wù),主進(jìn)程繼續(xù)監(jiān)聽(tīng)其他的客戶(hù)進(jìn)程。服務(wù)器掌握每個(gè)客戶(hù)的Socket,并能夠分辨來(lái)自不同客戶(hù)機(jī)的數(shù)據(jù),它根據(jù)Socket分別對(duì)不同的客戶(hù)機(jī)做出不同的響應(yīng)。從而對(duì)多個(gè)客戶(hù)端并發(fā)進(jìn)行通信。服務(wù)器/客戶(hù)端利用Socket數(shù)據(jù)傳輸流程(如圖2)。
3 數(shù)字圖書(shū)館通信原理
3.1 數(shù)字圖書(shū)館實(shí)現(xiàn)函數(shù)
3.1.1 Socket()函數(shù)
Int socket(int domain, int type, int protocol)。Socket()用來(lái)建立一個(gè)Socket數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)空間,通知系統(tǒng)建立一通信端口。參數(shù)domain指定使用何種的地址類(lèi)型,目前僅支持PF_INET(TCP/IP協(xié)議族)格式。
3.1.2 Bind()函數(shù)
Int bind(int sockfd, struct sockaddr my_addr, int addrlen)。Bind()用來(lái)設(shè)置給參數(shù)sockfd的socket一個(gè)名稱(chēng)。此名稱(chēng)由參數(shù)my_addr指向包含有本機(jī)IP地址和端口號(hào)等信息的指針,當(dāng)創(chuàng)建了一個(gè)Socket以后,套接字?jǐn)?shù)據(jù)結(jié)構(gòu)中有一個(gè)默認(rèn)的IP地址和默認(rèn)的端口號(hào)。一個(gè)服務(wù)程序必須調(diào)用bind函數(shù)將Socket與本機(jī)IP地址和一個(gè)特定端口相關(guān)聯(lián),隨后可以在該端口監(jiān)聽(tīng)服務(wù)請(qǐng)求。
3.1.3 Listen()函數(shù)
Int listen(int s, int backlog)。Listen()用來(lái)等待參數(shù)s的socket連線(xiàn)。參數(shù)backlog指定服務(wù)器端同時(shí)能處理的最大客戶(hù)端連接要求,如果連接數(shù)目達(dá)此上限則,client端將收到ECONNREFUSED的錯(cuò)誤。Listen()并未開(kāi)始接收連線(xiàn),只是設(shè)置socket為listen模式,真正接收客戶(hù)端連線(xiàn)的是accept()。
3.1.4 Recv()/ Send()函數(shù)
Int recv( SOCKET s,char FAR buf,int len,int flags)。Int send( SOCKET s,const char FAR buf,int len,int flags )。不論是客戶(hù)還是服務(wù)器應(yīng)用程序,都用recv/Send函數(shù)從TCP連接的另一端接收/發(fā)送數(shù)據(jù)。第一個(gè)參數(shù)指定接收端套接字描述符;第二個(gè)參數(shù)指明一個(gè)緩沖區(qū),該緩沖區(qū)用來(lái)存放Recv/Send函數(shù)接收/發(fā)送到的數(shù)據(jù);第三個(gè)參數(shù)指明buf緩沖區(qū)的長(zhǎng)度。
3.1.5 Connect()函數(shù)
Int connect(int sockfd, struct sockaddr serv_addr,int addrlen)。Sockfd是socket函數(shù)返回的socket描述符;serv_addr是包含遠(yuǎn)端主機(jī)IP地址和端口號(hào)的指針;Connect函數(shù)啟動(dòng)和遠(yuǎn)程主機(jī)的直接連接,Socket執(zhí)行體選擇一個(gè)未被占用的端口,并通知你的程序數(shù)據(jù)什么時(shí)候到達(dá)打斷口。
3.1.6 Closesocket()函數(shù)
Closesocket(SOCKET sockid)。在完成數(shù)據(jù)傳輸任務(wù)后,需要調(diào)用Closesocket()來(lái)關(guān)閉連接和釋放Socket結(jié)束本次通話(huà)。
3.2 SOCKET實(shí)現(xiàn)數(shù)字圖書(shū)館服務(wù)器端通信步驟
(1)聲明一個(gè)套接字類(lèi)型的變量,需要在該變量定義中服務(wù)器IP地址和通信端口并指明協(xié)議類(lèi)型。
(2)服務(wù)器端通過(guò)端口監(jiān)聽(tīng)進(jìn)入等待客戶(hù)端連接的狀態(tài)。
(3)如果收到連接,則從對(duì)方連接請(qǐng)求中獲取對(duì)方的IP地址和通信端口,并向?qū)Ψ桨l(fā)送連接成功的應(yīng)答信號(hào),服務(wù)完成后,終止該進(jìn)程與客戶(hù)的通信鏈路。
(4)端口繼續(xù)監(jiān)聽(tīng)服務(wù)請(qǐng)求,等待另一用戶(hù)。
3.3 在客戶(hù)端利用基于TCP/IP和SOCKET通信步驟
(1)聲明一個(gè)套接字類(lèi)型的變量,需要在該變量定義中提供客戶(hù)端IP地址和通信端口并指明協(xié)議類(lèi)型。
(2)向遠(yuǎn)程服務(wù)器發(fā)出連接請(qǐng)求,SOCKET數(shù)據(jù)結(jié)構(gòu)提供了一個(gè)網(wǎng)絡(luò)連接的五中信息,分別是通信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。
(3)如果連接成功,會(huì)收到對(duì)方的應(yīng)答信號(hào),以后的通信就可以通過(guò)通信通道進(jìn)行請(qǐng)求,結(jié)束后關(guān)閉通道并終止連接。
參考文獻(xiàn):
[1] 顧韻華,周淑琴等.DELPHI實(shí)用教程[M].北京:電子工業(yè)出版社,2003.
[2] Andrew S.Tanenbaum,熊桂喜譯.計(jì)算機(jī)網(wǎng)絡(luò)[M].北京:清華大學(xué)出版社,1998.
[3] 周天明,汪文勇.TCP/IP網(wǎng)絡(luò)原理與技術(shù)[M].北京:清華大學(xué)出版社,1998.
[4] 何進(jìn).基于Socket的TCP/IP網(wǎng)絡(luò)通訊模式研究[J].計(jì)算機(jī)應(yīng)用研究,2001,(8).
[5] 雷斌、楊建華.Visual C++6.0網(wǎng)絡(luò)編程技術(shù)[M].北京:人民郵電出版社,2000.
[6] 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].北京:清華大學(xué)出版社,1999.
[7] 黃超.Windows網(wǎng)絡(luò)編程[M].北京:人民郵電出版社,2003.
[8] 黃建華等.Delphi程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2002.