資源描述:
《Linux_Unix網(wǎng)絡(luò)編程指南(Socket 編程).docx》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Linux/Unix網(wǎng)絡(luò)編程指南(Socket編程)什么是socket?你始終聽到人們談?wù)撝?socket",而你不知道他的確切含義。那么,現(xiàn)在我告訴你:他是使用Unix文件描述符(filedescriptor)和其他程序通訊的方式。什么?Ok--你也許聽到一些Unix高手(hacker)這樣說:“Unix中所有的東西就是文件!”那個(gè)家伙也許正在說到一個(gè)事實(shí):Unix程序在執(zhí)行任何形式的I/O的時(shí)候,程序是在讀或者寫一個(gè)文件描述符。一個(gè)文件描述符只是一個(gè)和打開的文件相關(guān)聯(lián)的整數(shù)。但是(注意后面的話),這個(gè)文件可能是一個(gè)網(wǎng)絡(luò)連接
2、,F(xiàn)IFO,管道,終端,磁盤上的文件或者什么其他的東西。Unix中所有的東西是文件!因此,你想和Internet上別的程序通訊的時(shí)候,你將要通過文件描述符。最好相信剛才的話?,F(xiàn)在你腦海中或許冒出這樣的念頭:“那么我從哪里得到網(wǎng)絡(luò)通訊的文件描述符呢,聰明人?”無論如何,我要回答這個(gè)問題:你利用系統(tǒng)調(diào)用socket()。他返回套接口描述符(socketdescriptor),然后你再通過他來調(diào)用send()和recv()?!暗?..”,你可能現(xiàn)在叫起來,“如果他是個(gè)文件描述符,那么為什么不用一般的調(diào)用read()和write()
3、來通過套接口通訊?”簡單的答案是:“你可以使用一般的函數(shù)!”。詳細(xì)的答案是:“你可以,但是使用send()和recv()讓你更好的控制數(shù)據(jù)傳輸。”有這樣一個(gè)事實(shí):在我們的世界上,有很多種套接口。有DARPAInternet地址(Internet套接口),本地節(jié)點(diǎn)的路徑名(Unix套接口),CCITTX.25地址(你可以完全忽略X.25套接口)。也許在你的Unix機(jī)器上還有其他的。我們在這里只講第一種:Internet套接口。----------------------------------------------------
4、----------------------------Internet套接口的兩種類型什么意思?有兩種Internet套接口?是的。不,我在撒謊。其實(shí)還有很多,但是我可不想嚇著你。我們這里只講兩種。Exceptforthissentence,whereI'mgoingtotellyouthat"RawSockets"arealsoverypowerfulandyoushouldlookthemup.那兩種類型是什么呢?一種是"StreamSockets",另外一種是"DatagramSockets"。我們以后談到他們的時(shí)候也
5、會用到"SOCK_STREAM"和"SOCK_DGRAM"。數(shù)據(jù)報(bào)套接口有時(shí)也叫“無連接套接口”,如果你確實(shí)要連接的時(shí)候用connect()。流式套接口是可靠的雙向通訊的數(shù)據(jù)流。如果你向套接口按照順序輸出“1,2”,那么他們將按照順序“1,2”到達(dá)另一邊。他們也是無錯(cuò)誤的傳遞的,有自己的錯(cuò)誤控制。有誰在使用流式套接口?你可能聽說過telnet,不是嗎?他就使用流式套接口。你需要你所輸入的字符按順序到達(dá),不是嗎?同樣,WWW瀏覽器使用的HTTP協(xié)議也使用他們。實(shí)際上,當(dāng)你通過端口80端口telnet到一個(gè)WWW站點(diǎn),然后輸入“G
6、ETpagename”的時(shí)候,你也可以得到HTML的內(nèi)容。為什么流式套接口可以達(dá)到高質(zhì)量的數(shù)據(jù)傳輸?他使用了“傳輸控制協(xié)議(TheTransmissionControlProtocol)”,也叫“TCP”(請參考RFC-793獲得詳細(xì)資料。)TCP控制你的數(shù)據(jù)按順序到達(dá)并且沒有錯(cuò)誤。你也許聽到“TCP”是因?yàn)槁牭竭^“TCP/IP”。這里的IP是指“Internet協(xié)議”(請參考RFC-791.)IP只是處理Internet路由而已。那么數(shù)據(jù)報(bào)套接口呢?為什么他叫無連接呢?為什么他是不可靠的呢?恩,有這樣的事實(shí):如果你發(fā)送一個(gè)數(shù)
7、據(jù)報(bào),他可能到達(dá),他可能次序顛倒了。如果他到達(dá),那么在這個(gè)包的內(nèi)部是無錯(cuò)誤的。數(shù)據(jù)報(bào)也使用IP作路由,但是他不選擇TCP。他使用“用戶數(shù)據(jù)報(bào)協(xié)議(UserDatagramProtocol)”,也叫“UDP”(請參考RFC-768.)為什么他們是無連接的呢?主要原因是因?yàn)樗⒉幌罅魇教捉涌谀菢泳S持一個(gè)連接。你只要建立一個(gè)包,在目標(biāo)信息中構(gòu)造一個(gè)IP頭,然后發(fā)出去。不需要連接。應(yīng)用程序有:tftp,bootp等等?!皦蛄?!”你也許會想,“如果數(shù)據(jù)丟失了這些程序如何正常工作?”我的朋友,每個(gè)程序在UDP上有自己的協(xié)議。例如,tftp
8、協(xié)議每發(fā)出一個(gè)包,收到者發(fā)回一個(gè)包來說“我收到了!”(一個(gè)“命令正確應(yīng)答”也叫“ACK”包)。如果在一定時(shí)間內(nèi)(例如5秒),發(fā)送方?jīng)]有收到應(yīng)答,他將重新發(fā)送,直到得到ACK。這一點(diǎn)在實(shí)現(xiàn)SOCK_DGRAM應(yīng)用程序的時(shí)候非常重要。-----------------------