




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、LINUX網(wǎng)絡(luò)編程,行業(yè)事業(yè)部 黃文舉 2010.10.26,套接口,在Linux下,所有的I/O操作都是通過(guò)讀寫(xiě)文件描述符而產(chǎn)生的,文件描述符是一個(gè)和打開(kāi)的文件相關(guān)聯(lián)的整數(shù),而套接口就是系統(tǒng)進(jìn)程和文件描述符通信的一種方法,目前最常用的套接口:字節(jié)流套接口和數(shù)據(jù)報(bào)套接口、原始套接口。,TCP套接口,TCP套接口使用TCP建立連接,建立一個(gè)TCP連接需要三次握手,基本過(guò)程是服務(wù)器先建立一個(gè)套接口并等待客戶(hù)端的連接請(qǐng)求;當(dāng)客戶(hù)端調(diào)用 connect進(jìn)行主動(dòng)連接請(qǐng)求時(shí),客戶(hù)端TCP發(fā)送一個(gè)SYN,告訴服務(wù)器客戶(hù)端將在連接中發(fā)送的數(shù)據(jù)的初始序列號(hào);當(dāng)服務(wù)器收到這個(gè)SYN后也給客戶(hù)端發(fā)一個(gè)SYN,里面包
2、含了服務(wù)器將在同一連接中發(fā)送的數(shù)據(jù)的初始序列號(hào);最后客戶(hù)在確認(rèn)服務(wù)器發(fā)的SYN。到此為止,一個(gè)TCP連接被建立。,UDP套接口,UDP套接口 UDP套接口是無(wú)連接的、不可靠的數(shù)據(jù)報(bào)協(xié)議;既然它不可靠為什么還要用呢?其一:當(dāng)應(yīng)用程序使用廣播或多播是只能使用UDP協(xié)議;其二:由于他是無(wú)連接的,所以速度快。因?yàn)閁DP套接口是無(wú)連接的,如果一方的數(shù)據(jù)報(bào)丟失,那另一方將無(wú)限等待,解決辦法是設(shè)置一個(gè)超時(shí)。 在編寫(xiě)UDP套接口程序時(shí),有幾點(diǎn)要注意:建立套接口時(shí)socket函數(shù)的第二個(gè)參數(shù)應(yīng)該是SOCK_DGRAM,說(shuō)明是建立一個(gè)UDP套接口;由于 UDP是無(wú)連接的,所以服務(wù)器端并不需要listen或acce
3、pt函數(shù);當(dāng)UDP套接口調(diào)用connect函數(shù)時(shí),內(nèi)核只記錄連接放的IP地址和端口,并立即返回給調(diào)用進(jìn)程,SOCKET的位置,應(yīng)用層程序,TCP,UDP,IP,數(shù)據(jù)鏈路層及物理層,流式套 接口,數(shù)據(jù)報(bào) 套接口,原 始 套 接 口,網(wǎng)絡(luò)函數(shù)及用法,socket函數(shù):為了執(zhí)行網(wǎng)絡(luò)輸入輸出,一個(gè)進(jìn)程必須做的第一件事就是調(diào)用socket函數(shù)獲得一個(gè)文件描述符。 #include #include int socket(int family,int type,int protocol); 返回:非負(fù)描述字成功-1失敗,網(wǎng)絡(luò)函數(shù)及用法,connect函數(shù):當(dāng)用socket建立了套接口后,可以調(diào)用conne
4、ct為這個(gè)套接字指明遠(yuǎn)程端的地址。 #include #include int connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen); 返回:0成功-1失敗,網(wǎng)絡(luò)函數(shù)及用法,bind函數(shù):為套接口分配一個(gè)本地IP和協(xié)議端口。 #include #include int bind(int sockfd,const struct sockaddr * myaddr,socklen_t addrlen); 返回:0成功-1失敗,網(wǎng)絡(luò)函數(shù)及用法,listen函數(shù):listen函數(shù)僅被TCP服務(wù)器調(diào)用,它的作用是將用s
5、ocket創(chuàng)建的主動(dòng)套接口轉(zhuǎn)換成被動(dòng)套接口,并等待來(lái)自客戶(hù)端的連接請(qǐng)求。 #include int listen(int sockfd,int backlog); 返回:0成功-1失敗,網(wǎng)絡(luò)函數(shù)及用法,accept函數(shù):accept函數(shù)由TCP服務(wù)器調(diào)用, 從已完成連接隊(duì)列頭返回一個(gè)已完成連接,如果完成連接隊(duì)列為空,則進(jìn)程進(jìn)入睡眠狀態(tài)。 int accept(int sockfd,struct sockaddr * cliaddr,socklen_t * addrlen); 返回:非負(fù)描述字成功-1失敗,網(wǎng)絡(luò)函數(shù)及用法,connect函數(shù): connect函數(shù)是客戶(hù)端用來(lái)同服務(wù)端連接的.成功時(shí)
6、返回0,sockfd是同服務(wù)端通訊的文件描述符,失敗時(shí)返回-1. int connect(int sockfd, struct sockaddr * serv_addr,int addrlen) sockfd:socket返回的文件描述符. serv_addr:儲(chǔ)存了服務(wù)器端的連接信息.其中sin_add是服務(wù)端的地址 addrlen:serv_addr的長(zhǎng)度 返回:非負(fù)描述字成功-1失敗,網(wǎng)絡(luò)函數(shù)及用法,inet_pton函數(shù):將點(diǎn)分十進(jìn)制串轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序二進(jìn)制值,此函數(shù)對(duì)IPv4地址和IPv6地址都能處理。 int inet_pton(int family,const char * st
7、rptr,void * addrptr); 返回:1成功 0輸入不是有效的表達(dá)格式 -1失敗,網(wǎng)絡(luò)函數(shù)及用法,inet_ntop函數(shù):和inet_pton函數(shù)正好相反,inet_ntop函數(shù)是將網(wǎng)絡(luò)字節(jié)序二進(jìn)制值轉(zhuǎn)換成點(diǎn)分十進(jìn)制串。 const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len); 返回:指向結(jié)果的指針成功 NULL失敗,網(wǎng)絡(luò)理論,數(shù)據(jù)進(jìn)入?yún)f(xié)議棧時(shí)的封裝過(guò)程,封裝,當(dāng)應(yīng)用程序用TCP傳送數(shù)據(jù)時(shí),數(shù)據(jù)被送入?yún)f(xié)議棧中,然后 逐個(gè)通過(guò)每一層直到被當(dāng)做一串比特流送入網(wǎng)絡(luò)。其中每一層對(duì)收到的
8、數(shù)據(jù)都要增加一些首部的信息(有時(shí)還要增加尾部信息),此過(guò)程為封裝。 UDP和TCP數(shù)據(jù)基本一致。唯一不同的是UDP傳給IP的信息單元稱(chēng)作UDP數(shù)據(jù)報(bào),而且UDP的首部長(zhǎng)度為8字節(jié)。,以太網(wǎng)數(shù)據(jù)幀的分用過(guò)程,網(wǎng)絡(luò)理論,分用 當(dāng)目的主機(jī)收到一個(gè)以太網(wǎng)數(shù)據(jù)幀時(shí),數(shù)據(jù)就開(kāi)始從協(xié)議棧中由底向上,同時(shí)去掉各層協(xié)議加上的報(bào)文首部。每層協(xié)議盒都要去掉檢查報(bào)文首部中的協(xié)議標(biāo)識(shí),以確定接收數(shù)據(jù)的上層協(xié)議,這個(gè)過(guò)程就是分用。,面向連接的C/S 程序的工作流程(TCP),面向連接的C/S 程序的工作流程(TCP),面向連接的C/S 程序的工作流程圖(TCP),無(wú)連接的C/S 程序的工作流程(UDP),無(wú)連接的C/S
9、程序的工作流程(UDP),無(wú)連接的C/S 程序的工作流程圖(UDP),UDP服務(wù)器端,UDP客戶(hù)端,TCP服務(wù)器端,TCP客戶(hù)端,輸入輸出模型,LINUX的輸入輸出主要有4種模型: 阻塞式、非阻塞式、多路復(fù)用和信號(hào)驅(qū)動(dòng),阻塞式的輸入/輸出,在套接字上執(zhí)行以下4種函數(shù)調(diào)用會(huì)阻塞 a.讀操作:read、readv、recv、 recvfrom和recvmsg 這些操作的過(guò)程如圖a-1所示(以read為例),阻塞式的讀操作過(guò)程,阻塞式的寫(xiě)操作過(guò)程,b.寫(xiě)操作:write、writev、send、sendto和sendmsg 這些操作的過(guò)程如圖b-1所示(以write為例),阻塞式的寫(xiě)操作過(guò)程,阻塞式
10、的接收連接:accept,c. TCP套接字接收連接:accept 函數(shù)accept的執(zhí)行過(guò)程如圖c-1所示,阻塞式的接收操作過(guò)程,阻塞式的連接:connect,d. 建立連接connect,操作過(guò)程如圖d-1所示,阻塞式輸入/輸出優(yōu)缺點(diǎn),優(yōu)點(diǎn):編程模型清晰,結(jié)構(gòu)簡(jiǎn)單,通信雙方比較容易保持同步 缺陷:進(jìn)程可能永遠(yuǎn)阻塞、進(jìn)程的效率比較低,非阻塞式輸入輸出,在一個(gè)非阻塞式套接字上進(jìn)行輸入/輸 出操作時(shí),如果操作不能完成,那么操作 將以錯(cuò)誤返回。圖1-1描述了在非阻塞式套 接字進(jìn)行讀操作的過(guò)程。,非阻塞式的讀操作過(guò)程,非阻塞式讀、寫(xiě)、接收、連接,(1)讀操作,如果套接字接收緩沖區(qū)沒(méi)有數(shù)據(jù),函數(shù)將以錯(cuò)
11、誤(EWOULDBLOCK)返回。 (2)寫(xiě)操作,如果發(fā)送緩沖區(qū)中沒(méi)有空間,函數(shù)以錯(cuò)誤(EWOULDBLOCK )返回。 (3)接收連接操作,如果沒(méi)有新的連接,函數(shù)也是錯(cuò)誤( EWOULDBLOCK )返回 (4)連接操作,函數(shù)將啟動(dòng)TCP 協(xié)議3次握手過(guò)程,但是不等待連接的建立,而是立即以錯(cuò)誤返回,錯(cuò)誤類(lèi)型為EINPROGRESS。,設(shè)置非阻塞套接字,兩種方法: (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,多路復(fù)用輸入/輸出,多路復(fù)用輸入/輸出綜合了阻塞與非阻塞式輸入輸出的優(yōu)點(diǎn)。使用函數(shù)seclect可以同時(shí)檢查多個(gè)描述符是否就緒。當(dāng)有描述符就緒時(shí),函數(shù)seclet成功返回。圖3-1描述了輸入輸出多路復(fù)用模型。,多路復(fù)用select操作過(guò)程,信號(hào)驅(qū)動(dòng)輸入輸出模型,圖4-3 信號(hào)驅(qū)動(dòng)通信過(guò)程,信號(hào)驅(qū)動(dòng)輸入輸出模型,在一個(gè)套接字上使用信號(hào)驅(qū)動(dòng)輸入
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年助懸劑合作協(xié)議書(shū)
- 2025年工商用制冷、空調(diào)設(shè)備合作協(xié)議書(shū)
- 涉外工作證明與翻譯件(7篇)
- 動(dòng)產(chǎn)抵押借款協(xié)議
- 2025年新型診斷試劑與生物疫苗項(xiàng)目建議書(shū)
- 新能源汽車(chē)研發(fā)與制造技術(shù)合作協(xié)議
- 行政管理專(zhuān)業(yè)市政學(xué)難題試題及答案
- 品牌推廣及營(yíng)銷(xiāo)戰(zhàn)略合作協(xié)議文本
- 充電樁購(gòu)買(mǎi)合同協(xié)議書(shū)
- 私人服裝設(shè)計(jì)師定制服裝協(xié)議
- 20XX-煙草車(chē)輛運(yùn)輸方案計(jì)劃
- 蘇教版二年級(jí)下冊(cè)數(shù)學(xué)競(jìng)賽試卷
- CRH380B動(dòng)車(chē)組電氣系統(tǒng)綜述綜述
- 晶體幾何基礎(chǔ)
- 腹腔穿刺術(shù)考核評(píng)分表
- 作業(yè)準(zhǔn)備驗(yàn)證及停工后驗(yàn)證規(guī)定
- 控制電纜敷設(shè)、接線施工方案
- 定期清洗消毒空調(diào)及通風(fēng)設(shè)施的制度
- 空分冷箱基礎(chǔ)設(shè)計(jì)淺析
- 三國(guó)演義-人物-藝術(shù)手法
- 2025米往返接力跑教案
評(píng)論
0/150
提交評(píng)論