LINUX網(wǎng)絡編程.ppt_第1頁
LINUX網(wǎng)絡編程.ppt_第2頁
LINUX網(wǎng)絡編程.ppt_第3頁
LINUX網(wǎng)絡編程.ppt_第4頁
LINUX網(wǎng)絡編程.ppt_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、LINUX網(wǎng)絡編程,行業(yè)事業(yè)部 黃文舉 2010.10.26,套接口,在Linux下,所有的I/O操作都是通過讀寫文件描述符而產(chǎn)生的,文件描述符是一個和打開的文件相關聯(lián)的整數(shù),而套接口就是系統(tǒng)進程和文件描述符通信的一種方法,目前最常用的套接口:字節(jié)流套接口和數(shù)據(jù)報套接口、原始套接口。,TCP套接口,TCP套接口使用TCP建立連接,建立一個TCP連接需要三次握手,基本過程是服務器先建立一個套接口并等待客戶端的連接請求;當客戶端調用 connect進行主動連接請求時,客戶端TCP發(fā)送一個SYN,告訴服務器客戶端將在連接中發(fā)送的數(shù)據(jù)的初始序列號;當服務器收到這個SYN后也給客戶端發(fā)一個SYN,里面包

2、含了服務器將在同一連接中發(fā)送的數(shù)據(jù)的初始序列號;最后客戶在確認服務器發(fā)的SYN。到此為止,一個TCP連接被建立。,UDP套接口,UDP套接口 UDP套接口是無連接的、不可靠的數(shù)據(jù)報協(xié)議;既然它不可靠為什么還要用呢?其一:當應用程序使用廣播或多播是只能使用UDP協(xié)議;其二:由于他是無連接的,所以速度快。因為UDP套接口是無連接的,如果一方的數(shù)據(jù)報丟失,那另一方將無限等待,解決辦法是設置一個超時。 在編寫UDP套接口程序時,有幾點要注意:建立套接口時socket函數(shù)的第二個參數(shù)應該是SOCK_DGRAM,說明是建立一個UDP套接口;由于 UDP是無連接的,所以服務器端并不需要listen或acce

3、pt函數(shù);當UDP套接口調用connect函數(shù)時,內(nèi)核只記錄連接放的IP地址和端口,并立即返回給調用進程,SOCKET的位置,應用層程序,TCP,UDP,IP,數(shù)據(jù)鏈路層及物理層,流式套 接口,數(shù)據(jù)報 套接口,原 始 套 接 口,網(wǎng)絡函數(shù)及用法,socket函數(shù):為了執(zhí)行網(wǎng)絡輸入輸出,一個進程必須做的第一件事就是調用socket函數(shù)獲得一個文件描述符。 #include #include int socket(int family,int type,int protocol); 返回:非負描述字成功-1失敗,網(wǎng)絡函數(shù)及用法,connect函數(shù):當用socket建立了套接口后,可以調用conne

4、ct為這個套接字指明遠程端的地址。 #include #include int connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen); 返回:0成功-1失敗,網(wǎng)絡函數(shù)及用法,bind函數(shù):為套接口分配一個本地IP和協(xié)議端口。 #include #include int bind(int sockfd,const struct sockaddr * myaddr,socklen_t addrlen); 返回:0成功-1失敗,網(wǎng)絡函數(shù)及用法,listen函數(shù):listen函數(shù)僅被TCP服務器調用,它的作用是將用s

5、ocket創(chuàng)建的主動套接口轉換成被動套接口,并等待來自客戶端的連接請求。 #include int listen(int sockfd,int backlog); 返回:0成功-1失敗,網(wǎng)絡函數(shù)及用法,accept函數(shù):accept函數(shù)由TCP服務器調用, 從已完成連接隊列頭返回一個已完成連接,如果完成連接隊列為空,則進程進入睡眠狀態(tài)。 int accept(int sockfd,struct sockaddr * cliaddr,socklen_t * addrlen); 返回:非負描述字成功-1失敗,網(wǎng)絡函數(shù)及用法,connect函數(shù): connect函數(shù)是客戶端用來同服務端連接的.成功時

6、返回0,sockfd是同服務端通訊的文件描述符,失敗時返回-1. int connect(int sockfd, struct sockaddr * serv_addr,int addrlen) sockfd:socket返回的文件描述符. serv_addr:儲存了服務器端的連接信息.其中sin_add是服務端的地址 addrlen:serv_addr的長度 返回:非負描述字成功-1失敗,網(wǎng)絡函數(shù)及用法,inet_pton函數(shù):將點分十進制串轉換成網(wǎng)絡字節(jié)序二進制值,此函數(shù)對IPv4地址和IPv6地址都能處理。 int inet_pton(int family,const char * st

7、rptr,void * addrptr); 返回:1成功 0輸入不是有效的表達格式 -1失敗,網(wǎng)絡函數(shù)及用法,inet_ntop函數(shù):和inet_pton函數(shù)正好相反,inet_ntop函數(shù)是將網(wǎng)絡字節(jié)序二進制值轉換成點分十進制串。 const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len); 返回:指向結果的指針成功 NULL失敗,網(wǎng)絡理論,數(shù)據(jù)進入?yún)f(xié)議棧時的封裝過程,封裝,當應用程序用TCP傳送數(shù)據(jù)時,數(shù)據(jù)被送入?yún)f(xié)議棧中,然后 逐個通過每一層直到被當做一串比特流送入網(wǎng)絡。其中每一層對收到的

8、數(shù)據(jù)都要增加一些首部的信息(有時還要增加尾部信息),此過程為封裝。 UDP和TCP數(shù)據(jù)基本一致。唯一不同的是UDP傳給IP的信息單元稱作UDP數(shù)據(jù)報,而且UDP的首部長度為8字節(jié)。,以太網(wǎng)數(shù)據(jù)幀的分用過程,網(wǎng)絡理論,分用 當目的主機收到一個以太網(wǎng)數(shù)據(jù)幀時,數(shù)據(jù)就開始從協(xié)議棧中由底向上,同時去掉各層協(xié)議加上的報文首部。每層協(xié)議盒都要去掉檢查報文首部中的協(xié)議標識,以確定接收數(shù)據(jù)的上層協(xié)議,這個過程就是分用。,面向連接的C/S 程序的工作流程(TCP),面向連接的C/S 程序的工作流程(TCP),面向連接的C/S 程序的工作流程圖(TCP),無連接的C/S 程序的工作流程(UDP),無連接的C/S

9、程序的工作流程(UDP),無連接的C/S 程序的工作流程圖(UDP),UDP服務器端,UDP客戶端,TCP服務器端,TCP客戶端,輸入輸出模型,LINUX的輸入輸出主要有4種模型: 阻塞式、非阻塞式、多路復用和信號驅動,阻塞式的輸入/輸出,在套接字上執(zhí)行以下4種函數(shù)調用會阻塞 a.讀操作:read、readv、recv、 recvfrom和recvmsg 這些操作的過程如圖a-1所示(以read為例),阻塞式的讀操作過程,阻塞式的寫操作過程,b.寫操作:write、writev、send、sendto和sendmsg 這些操作的過程如圖b-1所示(以write為例),阻塞式的寫操作過程,阻塞式

10、的接收連接:accept,c. TCP套接字接收連接:accept 函數(shù)accept的執(zhí)行過程如圖c-1所示,阻塞式的接收操作過程,阻塞式的連接:connect,d. 建立連接connect,操作過程如圖d-1所示,阻塞式輸入/輸出優(yōu)缺點,優(yōu)點:編程模型清晰,結構簡單,通信雙方比較容易保持同步 缺陷:進程可能永遠阻塞、進程的效率比較低,非阻塞式輸入輸出,在一個非阻塞式套接字上進行輸入/輸 出操作時,如果操作不能完成,那么操作 將以錯誤返回。圖1-1描述了在非阻塞式套 接字進行讀操作的過程。,非阻塞式的讀操作過程,非阻塞式讀、寫、接收、連接,(1)讀操作,如果套接字接收緩沖區(qū)沒有數(shù)據(jù),函數(shù)將以錯

11、誤(EWOULDBLOCK)返回。 (2)寫操作,如果發(fā)送緩沖區(qū)中沒有空間,函數(shù)以錯誤(EWOULDBLOCK )返回。 (3)接收連接操作,如果沒有新的連接,函數(shù)也是錯誤( EWOULDBLOCK )返回 (4)連接操作,函數(shù)將啟動TCP 協(xié)議3次握手過程,但是不等待連接的建立,而是立即以錯誤返回,錯誤類型為EINPROGRESS。,設置非阻塞套接字,兩種方法: (1)函數(shù)fcntl,操作如下: int flags; flag = fcntl(sockfd,F_GETFL,0); fcntl(sockfd,F_SETFL,flag|O_NONBLOCK); (2)函數(shù)ioctl,操作如下: int on = 1; ioctl(sockfd,FIONBIO,多路復用輸入/輸出,多路復用輸入/輸出綜合了阻塞與非阻塞式輸入輸出的優(yōu)點。使用函數(shù)seclect可以同時檢查多個描述符是否就緒。當有描述符就緒時,函數(shù)seclet成功返回。圖3-1描述了輸入輸出多路復用模型。,多路復用select操作過程,信號驅動輸入輸出模型,圖4-3 信號驅動通信過程,信號驅動輸入輸出模型,在一個套接字上使用信號驅動輸入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論