靈魂-放水

          為學(xué)日益,為道日損。

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
          Socket編程基礎(chǔ)

          本章以Berkeley Socket為主,主要介紹網(wǎng)絡(luò)編程時(shí)常用的調(diào)用和程序使用它們的方法及基本結(jié)構(gòu)。網(wǎng)絡(luò)編程有兩種主要的編程接口,一種是Berkeley UNIX(BSD UNIX)的socket編程接口,另一種是AT&T的TLI接口(用于UNIXSYSV)。
          1 、TCP/IP 基礎(chǔ)知識(shí)
          這里先假定讀者對(duì)ISO的OSI七層模型已有了一定的了解,下面我們來(lái)看看TCP/IP模型。ISO的OSI對(duì)服務(wù)、接口和協(xié)議的概念區(qū)別十分明了,但它卻沒(méi)有真正的用戶(hù)群。TCP/IP模型對(duì)服務(wù)、接口和協(xié)議的概念區(qū)別不象OSI模型那樣明晰,但很實(shí)用。TCP/IP模型分為四層,對(duì)應(yīng)于OSI七層模型如下圖所示:圖6-1 TCP/IP參考模型與OSI模型的近似對(duì)應(yīng)關(guān)系在TCP/IP模型中,互聯(lián)網(wǎng)層是基于無(wú)連接互聯(lián)網(wǎng)絡(luò)層的分組交換網(wǎng)絡(luò)。在這一層中主機(jī)可以把報(bào)文(Packet)發(fā)往任何網(wǎng)絡(luò),報(bào)文獨(dú)立地傳向目標(biāo)。互聯(lián)網(wǎng)層定義了報(bào)文的格式和協(xié)議,這就是IP協(xié)議族(Internet Protocol)。互聯(lián)網(wǎng)層的功能是將報(bào)文發(fā)送到目的地,主要的設(shè)計(jì)問(wèn)題是報(bào)文路由和避免阻塞。互聯(lián)網(wǎng)層上面是傳輸層,該層的主要功能和OSI模型的該層一樣,主要使源和目的主機(jī)之間可以進(jìn)行會(huì)話。該層定義了兩個(gè)端到端的協(xié)議,一個(gè)是面向連接的傳輸控制協(xié)議TCP,另一個(gè)是無(wú)連接的用戶(hù)數(shù)據(jù)報(bào)協(xié)議UDP。TCP/IP協(xié)議模型中沒(méi)有會(huì)話層和表示層。傳輸層之上是應(yīng)用層,它包含所有的高層協(xié)議,如遠(yuǎn)程虛擬終端協(xié)議TELNET、文件傳輸協(xié)議FTP、簡(jiǎn)單郵件傳輸協(xié)議SMTP等。這些高層協(xié)議中常見(jiàn)的如TELNET協(xié)議,用來(lái)允許用戶(hù)遠(yuǎn)程登錄到另一臺(tái)UNIX機(jī)器;FTP協(xié)議用來(lái)傳輸文件,常見(jiàn)的有WU-FTP(Washington University的FTP服務(wù)器端程序,是一個(gè)免費(fèi)程序);SMTP協(xié)議用來(lái)傳送email,常見(jiàn)的服務(wù)器端程序有netscape等公司制作的程序,也有免費(fèi)使用的sendmail程序;還有域名系統(tǒng)服務(wù)DNS協(xié)議,新聞組傳送協(xié)議NNTP,用于WWW的超文本傳輸協(xié)議HTTP等。主機(jī)到網(wǎng)絡(luò)這一層,在TCP/IP模型中沒(méi)有詳細(xì)定義,這里不作介紹。
          2、 Socket一般描述
          由于越來(lái)越多的計(jì)算機(jī)廠商,特別是工作站制造商如Sun等公司采用了Berkeley UNIX,socket接口被廣泛采用,以至于現(xiàn)在,socket接口被廣泛認(rèn)可并成為了事實(shí)上的工業(yè)標(biāo)準(zhǔn)。目前的SYSV、BSD、OSF都將socket接口作為系統(tǒng)的一部分。當(dāng)時(shí)設(shè)計(jì)如何支持TCP/IP協(xié)議時(shí),有兩種加入函數(shù)的方法,一種是直接加入支持TCP/IP協(xié)議的調(diào)用,另一種是加入支持一般網(wǎng)絡(luò)協(xié)議的函數(shù),而用參數(shù)來(lái)指定支持TCP/IP協(xié)議。Berkeley采用了后者,這樣可以支持多協(xié)議族,TCP/IP是協(xié)議族之一(PF_INET)。
          2.1 socket 描述符
          前面已經(jīng)提到過(guò),在UNIX中,進(jìn)程要對(duì)文件進(jìn)行操作,一般使用open調(diào)用打開(kāi)一個(gè)文件進(jìn)行訪問(wèn),每個(gè)進(jìn)程都有一個(gè)文件描述符表,該表中存放打開(kāi)的文件描述符。用戶(hù)使用open等調(diào)用得到的文件描述符其實(shí)是文件描述符在該表中的索引號(hào),該表項(xiàng)的內(nèi)容是一個(gè)指向文件表的指針。應(yīng)用程序只要使用該描述符就可以對(duì)指定文件進(jìn)行操作。同樣,socket接口增加了網(wǎng)絡(luò)通信操作的抽象定義,與文件操作一樣,每個(gè)打開(kāi)的socket都對(duì)應(yīng)一個(gè)整數(shù),我們稱(chēng)它為socket描述符,該整數(shù)也是socket描述符在文件描述符表中的索引值。但socket描述符在描述符表中的表項(xiàng)并不指向文件表,而是指向一個(gè)與該socket有關(guān)的數(shù)據(jù)結(jié)構(gòu)。BSD UNIX中新增加了一個(gè)socket調(diào)用,應(yīng)用程序可以調(diào)用它來(lái)新建一個(gè)socket描述符,注意進(jìn)程用open只能產(chǎn)生文件描述符,而不能產(chǎn)生socket描述符。socket調(diào)用只能完成建立通信的部分工作,一旦建立了一個(gè)socket,應(yīng)用程序可以使用其他特定的調(diào)用來(lái)為它添加其他詳細(xì)信息,以完成建立通信的過(guò)程。
          2.2 從概念上理解socket的使用網(wǎng)絡(luò)編程中最常見(jiàn)的是客戶(hù)/服務(wù)器模式。
          以該模式編程時(shí),服務(wù)端有一個(gè)進(jìn)程(或多個(gè)進(jìn)程)在指定的端口等待客戶(hù)來(lái)連接,服務(wù)程序等待客戶(hù)的連接信息,一旦連接上之后,就可以按設(shè)計(jì)的數(shù)據(jù)交換方法和格式進(jìn)行數(shù)據(jù)傳輸。客戶(hù)端在需要的時(shí)刻發(fā)出向服務(wù)端的連接請(qǐng)求。
          這里為了便于理解,提到了這些調(diào)用及其大致的功能。使用socket調(diào)用后,僅產(chǎn)生了一個(gè)可以使用的socket描述符,這時(shí)還不能進(jìn)行通信,還要使用其他的調(diào)用,以使得socket所指的結(jié)構(gòu)中使用的信息被填寫(xiě)完。在使用TCP協(xié)議時(shí),一般服務(wù)端進(jìn)程先使用socket調(diào)用得到一個(gè)描述符,然后使用bind調(diào)用將一個(gè)名字與socket描述符連接起來(lái),對(duì)于Internet域就是將Internet地址聯(lián)編到socket。之后,服務(wù)端使用listen調(diào)用指出等待服務(wù)請(qǐng)求隊(duì)列的長(zhǎng)度。然后就可以使用accept調(diào)用等待客戶(hù)端發(fā)起連接(一般是阻塞等待連接,后面章節(jié)會(huì)講到非阻塞的方式),一旦有客戶(hù)端發(fā)出連接,accept返回客戶(hù)的地址信息,并返回一個(gè)新的socket描述符,該描述符與原先的socket有相同的特性,這時(shí)服務(wù)端就可以使用這個(gè)新的socket進(jìn)行讀寫(xiě)操作了。一般服務(wù)端可能在accept返回后創(chuàng)建一個(gè)新的進(jìn)程進(jìn)行與客戶(hù)的通信,父進(jìn)程則再到accept調(diào)用處等待另一個(gè)連接。客戶(hù)端進(jìn)程一般先使用socket調(diào)用得到一個(gè)socket描述符,然后使用connect向指定的服務(wù)器上的指定端口發(fā)起連接,一旦連接成功返回,就說(shuō)明已經(jīng)建立了與服務(wù)器的連接,這時(shí)就可以通過(guò)socket描述符進(jìn)行讀寫(xiě)操作了。下面是在客戶(hù)和服務(wù)端使用TCP時(shí),客戶(hù)進(jìn)程和服務(wù)進(jìn)程使用系統(tǒng)調(diào)用的該程。
          使用TCP的客戶(hù)和服務(wù)端使用系統(tǒng)調(diào)用的圖示使用無(wú)連接的UDP協(xié)議時(shí),服務(wù)端進(jìn)程創(chuàng)建一個(gè)socket,之后調(diào)用recvfrom接收客戶(hù)端的數(shù)據(jù)報(bào),然后調(diào)用sendto將要返回客戶(hù)端的消息發(fā)送給客戶(hù)進(jìn)程。客戶(hù)端也要先創(chuàng)建一個(gè)socket,再使用sendto向服務(wù)端進(jìn)程發(fā)出請(qǐng)求,使用recvfrom得到返回的消息。
          posted on 2006-09-24 10:53 放水老倌 閱讀(472) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 網(wǎng)絡(luò)編程
          主站蜘蛛池模板: 个旧市| 禹州市| 凤阳县| 忻城县| 延寿县| 岱山县| 昔阳县| 瑞昌市| 大化| 莱西市| 陆丰市| 望奎县| 昭苏县| 綦江县| 景谷| 德化县| 文水县| 定陶县| 筠连县| 崇文区| 扬中市| 松江区| 湘潭县| 宝鸡市| 佛坪县| 沙田区| 台东县| 乳源| 乌海市| 富蕴县| 金阳县| 陇南市| 郴州市| 林甸县| 灵石县| 大埔县| 望都县| 巧家县| 松江区| 永顺县| 额尔古纳市|