freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

socket簡易教程(已修改)

2025-07-07 07:28 本頁面
 

【正文】 網(wǎng)絡socket編程指南(轉貼)1作者:流浪者發(fā)表于:2003041117:09:07 Beej網(wǎng)絡socket編程指南介紹  Socket編程讓你沮喪嗎?從manpages中很難得到有用的信息嗎?你想跟上時代去編Internet相關的程序,但是為你在調用connect()前的bind()的結構而不知所措?等等…好在我已經(jīng)將這些事完成了,我將和所有人共享我的知識了。如果你了解C語言并想穿過網(wǎng)絡編程的沼澤,那么你來對地方了。讀者對象  這個文檔是一個指南,而不是參考書。如果你剛開始socket編程并想找一本入門書,那么你是我的讀者。但這不是一本完全的socket編程書。平臺和編譯器  這篇文檔中的大多數(shù)代碼都在Linux平臺PC上用GNU的gcc成功編譯過。而且它們在HPUX平臺上用gcc也成功編譯過。但是注意,并不是每個代碼片段都獨立測試過。目錄:1)什么是套接字?2)Internet套接字的兩種類型3)網(wǎng)絡理論4)結構體5)本機轉換6)IP地址和如何處理它們7)socket()函數(shù)8)bind()函數(shù)9)connect()函數(shù)10)listen()函數(shù)11)accept()函數(shù)12)send()和recv()函數(shù)13)sendto()和recvfrom()函數(shù)14)close()和shutdown()函數(shù)15)getpeername()函數(shù)16)gethostname()函數(shù)17)域名服務(DNS)18)客戶服務器背景知識19)簡單的服務器20)簡單的客戶端21)數(shù)據(jù)報套接字Socket22)阻塞23)select()多路同步I/O24)參考資料1)什么是socket:  你經(jīng)常聽到人們談論著“socket”,或許你還不知道它的確切含義?,F(xiàn)在讓我告訴你:它是使用標準Unix文件描述符(filedescriptor)和其它程序通訊的方式。什么?你也許聽到一些Unix高手(hacker)這樣說過:“呀,Unix中的一切就是文件!”那個家伙也許正在說到一個事實:Unix程序在執(zhí)行任何形式的I/O的時候,程序是在讀或者寫一個文件描述符。一個文件描述符只是一個和打開的文件相關聯(lián)的整數(shù)。但是(注意后面的話),這個文件可能是一個網(wǎng)絡連接,F(xiàn)IFO,管道,終端,磁盤上的文件或者什么其它的東西。Unix中所有的東西就是文件!所以,你想和Internet上別的程序通訊的時候,你將要使用到文件描述符。你必須理解剛才的話?,F(xiàn)在你腦海中或許冒出這樣的念頭:“那么我從哪里得到網(wǎng)絡通訊的文件描述符呢?”,這個問題無論如何我都要回答:你利用系統(tǒng)調用socket(),它返回套接字描述符(socketdescriptor),然后你再通過它來進行send()和recv()調用?!暗?..”,你可能有很大的疑惑,“如果它是個文件描述符,那么為什么不用一般調用read()和write()來進行套接字通訊?”簡單的答案是:“你可以使用!”。詳細的答案是:“你可以,但是使用send()和recv()讓你更好的控制數(shù)據(jù)傳輸?!贝嬖谶@樣一個情況:在我們的世界上,有很多種套接字。有DARPAInternet地址(Internet套接字),本地節(jié)點的路徑名(Unix套接字),CCITT(套接字完全忽略)。也許在你的Unix機器上還有其它的。我們在這里只講第一種:Internet套接字。2)Internet套接字的兩種類型:  什么意思?有兩種類型的Internet套接字?是的。不,我在撒謊。其實還有很多,但是我可不想嚇著你。我們這里只講兩種。除了這些,我打算另外介紹的RawSockets也是非常強大的,很值得查閱。 那么這兩種類型是什么呢?一種是StreamSockets(流格式),另外一種是DatagramSockets(數(shù)據(jù)包格式)。我們以后談到它們的時候也會用到SOCK_STREAM和SOCK_DGRAM。數(shù)據(jù)報套接字有時也叫“無連接套接字”(如果你確實要連接的時候可以用connect()。)流式套接字是可靠的雙向通訊的數(shù)據(jù)流。如果你向套接字按順序輸出“1,2”,那么它們將按順序“1,2”到達另一邊。它們是無錯誤的傳遞的,有自己的錯誤控制,在此不討論。有什么在使用流式套接字?你可能聽說過telnet,不是嗎?它就使用流式套接字。你需要你所輸入的字符按順序到達,不是嗎?同樣,WWW瀏覽器使用的HTTP協(xié)議也使用它們來下載頁面。實際上,當你通過端口80telnet到一個WWW站點,然后輸入“GETpagename”的時候,你也可以得到HTML的內容。為什么流式套接字可以達到高質量的數(shù)據(jù)傳輸?這是因為它使用了“傳輸控制協(xié)議(TheTransmissionControlProtocol)”,也叫“TCP”(請參考RFC793獲得詳細資料。)TCP控制你的數(shù)據(jù)按順序到達并且沒有錯誤。你也許聽到“TCP”是因為聽到過“TCP/IP”。這里的IP是指“Internet協(xié)議”(請參考RFC791。)IP只是處理Internet路由而已。那么數(shù)據(jù)報套接字呢?為什么它叫無連接呢?為什么它是不可靠的呢?有這樣的一些事實:如果你發(fā)送一個數(shù)據(jù)報,它可能會到達,它可能次序顛倒了。如果它到達,那么在這個包的內部是無錯誤的。數(shù)據(jù)報也使用IP作路由,但是它不使用TCP。它使用“用戶數(shù)據(jù)報協(xié)議(UserDatagramProtocol)”,也叫“UDP”(請參考RFC768。)為什么它們是無連接的呢?主要是因為它并不象流式套接字那樣維持一個連接。你只要建立一個包,構造一個有目標信息的IP頭,然后發(fā)出去。無需連接。它們通常使用于傳輸包包信息。簡單的應用程序有:tftp,bootp等等。你也許會想:“假如數(shù)據(jù)丟失了這些程序如何正常工作?”我的朋友,每個程序在UDP上有自己的協(xié)議。例如,tftp協(xié)議每發(fā)出的一個被接受到包,收到者必須發(fā)回一個包來說“我收到了!”(一個“命令正確應答”也叫“ACK”包)。如果在一定時間內(例如5秒),發(fā)送方?jīng)]有收到應答,它將重新發(fā)送,直到得到ACK。這一ACK過程在實現(xiàn)SOCK_DGRAM應用程序的時候非常重要。3)網(wǎng)絡理論:  既然我剛才提到了協(xié)議層,那么現(xiàn)在是討論網(wǎng)絡究竟如何工作和一些關于SOCK_DGRAM包是如何建立的例子。當然,你也可以跳過這一段,如果你認為已經(jīng)熟悉的話。現(xiàn)在是學習數(shù)據(jù)封裝(DataEncapsulation)的時候了!它非常非常重要。它重要性重要到你在網(wǎng)絡課程學(圖1:數(shù)據(jù)封裝)習中無論如何也得也得掌握它。主要的內容是:一個包,先是被第一個協(xié)議(在這里是TFTP)在它的報頭(也許是報尾)包裝(“封裝”),然后,整個數(shù)據(jù)(包括TFTP頭)被另外一個協(xié)議(在這里是UDP)封裝,然后下一個(IP),一直重復下去,直到硬件(物理)層(這里是以太網(wǎng))。 當另外一臺機器接收到包,硬件先剝去以太網(wǎng)頭,內核剝去IP和UDP頭,TFTP程序再剝去TFTP頭,最后得到數(shù)據(jù)。現(xiàn)在我們終于講到聲名狼藉的網(wǎng)絡分層模型(LayeredNetworkModel)。這種網(wǎng)絡模型在描述網(wǎng)絡系統(tǒng)上相對其它模型有很多優(yōu)點。例如,你可以寫一個套接字程序而不用關心數(shù)據(jù)的物理傳輸(串行口,以太網(wǎng),連接單元接口(AUI)還是其它介質),因為底層的程序會為你處理它們。實際的網(wǎng)絡硬件和拓撲對于程序員來說是透明的。不說其它廢話了,我現(xiàn)在列出整個層次模型。如果你要參加網(wǎng)絡考試,可一定要記?。簯脤?Application)表示層(Presentation)會話層(Session)傳輸層(Transport)網(wǎng)絡層(Network)數(shù)據(jù)鏈路層(DataLink)物理層(Physical)物理層是硬件(串口,以太網(wǎng)等等)。應用層是和硬件層相隔最遠的它是用戶和網(wǎng)絡交互的地方。這個模型如此通用,如果你想,你可以把它作為修車指南。把它對應到Unix,結果是:應用層(ApplicationLayer)(telnet,ftp,等等)傳輸層(HosttoHostTransportLayer)(TCP,UDP)Internet層(InternetLayer)(IP和路由)網(wǎng)絡訪問層(NetworkAccessLayer)(網(wǎng)絡層,數(shù)據(jù)鏈路層和物理層)現(xiàn)在,你可能看到這些層次如何協(xié)調來封裝原始的數(shù)據(jù)了??纯唇⒁粋€簡單的數(shù)據(jù)包有多少工作?哎呀,你將不得不使用cat來建立數(shù)據(jù)包頭!這僅僅是個玩笑。對于流式套接字你要作的是send()發(fā)送數(shù)據(jù)。對于數(shù)據(jù)報式套接字,你按照你選擇的方式封裝數(shù)據(jù)然后使用sendto()。內核將為你建立傳輸層和Internet層,硬件完成網(wǎng)絡訪問層。這就是現(xiàn)代科技。現(xiàn)在結束我們的網(wǎng)絡理論速成班。哦,忘記告訴你關于路由的事情了。但是我不準備談它,如果你真的關心,那么參考IPRFC。4)結構體:終于談到編程了。在這章,我將談到被套接字用到的各種數(shù)據(jù)類型。因為它們中的一些內容很重要了。首先是簡單的一個:socket描述符。它是下面的類型:int僅僅是一個常見的int。從現(xiàn)在起,事情變得不可思議了,而你所需做的就是繼續(xù)看下去。注意這樣的事實:有兩種字節(jié)排列順序:重要的字節(jié)(有時叫octet,即八位位組)在前面,或者不重要的字節(jié)在前面。前一種叫“網(wǎng)絡字節(jié)順序(NetworkByteOrder)”。有些機器在內部是按照這個順序儲存數(shù)據(jù),而另外一些則不然。當我說某數(shù)據(jù)必須按照NBO順序,那么你要調用函數(shù)(例如htons())來將它從本機字節(jié)順序(HostByteOrder)轉換過來。如果我沒有提到NBO,那么就讓它保持本機字節(jié)順序。我的第一個結構(在這個技術手冊TM中)structsockaddr.。這個結構為許多類型的套接字儲存套接字地址信息:structsockaddr{  unsignedshortsa_family。/*地址家族,AF_xxx*/  charsa_data[14]。/*14字節(jié)協(xié)議地址*/  }。sa_family能夠是各種各樣的類型,但是在這篇文章中都是AF_INET。sa_data包含套接字中的目標地址和端口信息。這好像有點不明智。為了處理structsockaddr,程序員創(chuàng)造了一個并列的結構:structsockaddr_in(in代表Internet。)structsockaddr_in{  shortintsin_family。/*通信類型*/  unsignedshortintsin_port。/*端口*/  struct in_addr sin_addr。/*Internet地址*/  unsignedcharsin_zero[8]。/*與sockaddr結構的長度相同*/  }。用這個數(shù)據(jù)結構可以輕松處理套接字地址的基本元素。注意sin_zero(它被加入到這個結構,并且長度和structsockaddr一樣)應該使用函數(shù)bzero()或memset()來全部置零。同時,這一重要的字節(jié),一個指向sockaddr_in結構體的指針也可以被指向結構體sockaddr并且代替它。這樣的話即使socket()想要的是structsockaddr*,你仍然可以使用structsockaddr_in,并且在最后轉換。同時,注意sin_family和structsockaddr中的sa_family一致并能夠設置為AF_INET。最后,sin_port和sin_addr必須是網(wǎng)絡字節(jié)順序(NetworkByteOrder)!你也許會反對道:但是,怎么讓整個數(shù)據(jù)結構structin_addrsin_addr按照網(wǎng)絡字節(jié)順序呢?要知道這個問題的答案,我們就要仔細的看一看這個數(shù)據(jù)結構:structin_addr,有這樣一個聯(lián)合(unions):/*Internet地址(一個與歷史有關的結構)*/  structin_addr{
點擊復制文檔內容
職業(yè)教育相關推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1