08-socket應(yīng)用編程_專題講座_v1 0 1下-王保明_第1頁
08-socket應(yīng)用編程_專題講座_v1 0 1下-王保明_第2頁
08-socket應(yīng)用編程_專題講座_v1 0 1下-王保明_第3頁
08-socket應(yīng)用編程_專題講座_v1 0 1下-王保明_第4頁
08-socket應(yīng)用編程_專題講座_v1 0 1下-王保明_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、輕松入門 實(shí)戰(zhàn)應(yīng)用 從項(xiàng)目開發(fā)角度 為你搭建完整的知識(shí)體系 wangbaominglinux Socket-應(yīng)用編程-專題講座 written by 王保明5Socket Api編程進(jìn)價(jià)2服務(wù)器端多進(jìn)程并發(fā)子進(jìn)程退出問題TCP回射客戶/服務(wù)器模型總結(jié)TCP是個(gè)流協(xié)議q TCP是基于字節(jié)流傳輸?shù)?,只維護(hù)發(fā)送出去多少,確認(rèn)了多少,沒有維護(hù)消息與消息之間的邊界,因而可能導(dǎo)致粘包問題。q 粘包問題解決方法是在應(yīng)用層維護(hù)消息邊界。僵進(jìn)程與SIGCHLD信號(hào)服務(wù)器端避免僵尸進(jìn)程的方法:1)通過忽略SIGCHLD信號(hào),解決僵尸進(jìn)程q signal(SIGCHLD, SIG_IGN)q2)通過wait方法,解

2、決僵尸進(jìn)程q signal(SIGCHLD, handle_sigchld);q wait(NULL)3)通過waitpid方法,解決僵尸進(jìn)程q signal(SIGCHLD, handle_sigchld);q wait(-1, NULL, WNOHANG) q6Socket Api 與TCP/IP的11種狀態(tài) TCP/IP協(xié)議的11種狀態(tài) 理解0:什么是主動(dòng)套接字,什么是被動(dòng)套接字?理解1:為什么TCP/IP要三次握手,和四次斷開?理解2:客戶端狀態(tài)向前推進(jìn)過程,服務(wù)器端狀態(tài)向前推進(jìn)過程理解3:執(zhí)行主動(dòng)關(guān)閉的那一端,進(jìn)入TIME_WAIT狀態(tài)理解4:TIME_WAIT 時(shí)間是多長(zhǎng)2MSL

3、(2倍的最大生命期時(shí)間) 原因:(ACK y+1)如果發(fā)送失敗可以重發(fā)。 服務(wù)器端處于closed狀態(tài),不等于客戶端也處于closed狀態(tài)。理解5:圖上幾種狀態(tài),還有一種CLOSING狀態(tài)兩端同時(shí)關(guān)閉將產(chǎn)生closing狀態(tài),最后雙方都進(jìn)入TIME_WAIT狀態(tài)。實(shí)驗(yàn):1) 關(guān)閉服務(wù)方子進(jìn)程,觀察TCP/IP狀態(tài)2) 關(guān)閉客戶端,觀察TCP/IP狀態(tài)。SIGPIPE如果對(duì)方socket已關(guān)閉,對(duì)等方再發(fā)寫數(shù)據(jù),則會(huì)產(chǎn)生SIGPIPE信號(hào)q SIGPIPE信號(hào)會(huì)讓進(jìn)程終止(man 7 signal,閱讀SIGPIPE默認(rèn)ACT)q 往一個(gè)已經(jīng)接收FIN的套接中寫是允許的,接收到FIN僅僅代表對(duì)方

4、不再發(fā)送數(shù)據(jù)。q 在收到RST段之后,如果再調(diào)用write就會(huì)產(chǎn)生SIGPIPE信號(hào),對(duì)于這個(gè)信號(hào)的處理我們通常忽略即可。signal(SIGPIPE, SIG_IGN); 結(jié)論:對(duì)SIGPIPE處理方法:1)忽略該信號(hào)即可signal(SIGPIPE, SIG_IGN);2)捕捉。改變默認(rèn)行為。TCP/IP 的RST段重置1)服務(wù)器端啟動(dòng)、客戶端啟動(dòng)2)服務(wù)器端先kill與客戶端通訊的子進(jìn)程,服務(wù)器端會(huì)給客戶端發(fā)送FIN分節(jié)此時(shí):只代表服務(wù)器端不發(fā)送數(shù)據(jù)了,不能代表客戶端不能往套接字中寫數(shù)據(jù)。3)如果子進(jìn)程此時(shí)寫數(shù)據(jù)給服務(wù)器端(解除屏幕阻塞,輸入字符aaaa),將要導(dǎo)致TCP/IP協(xié)議重置,

5、產(chǎn)生RST段;產(chǎn)生SIGPIPE信號(hào)。4)所以,一般情況下,需要我們處理SIGPIPE信號(hào),忽略即可。close與shutdown區(qū)別q close終止了數(shù)據(jù)傳送的兩個(gè)方向。q shutdown可以有選擇的終止某個(gè)方向的數(shù)據(jù)傳送或者終止數(shù)據(jù)傳送的兩個(gè)方向。q shutdown how=1就可以保證對(duì)等方接收到一個(gè)EOF字符,而不管其他進(jìn)程是否已經(jīng)打開了套接字。而close不能保證,直到套接字引用計(jì)數(shù)減為0時(shí)才發(fā)送。也就是說直到所有的進(jìn)程都關(guān)閉了套接字。思考1客戶端向服務(wù)器發(fā)送:FIN(close) E D C B A,問:服務(wù)器還能收到數(shù)據(jù)嗎?服務(wù)器還可以向客戶端回報(bào)文嗎?客戶端想在關(guān)閉之后,

6、仍然能接收到回射服務(wù)器應(yīng)答(shutdown)。思考2父進(jìn)程中close(conn);會(huì)不會(huì)向客戶端發(fā)送FIN報(bào)文段那? 文件的引用計(jì)數(shù)-1,當(dāng)減少為0,才會(huì)發(fā)送引用計(jì)數(shù)。思考3: 客戶端/shutdown(sock, SHUT_WR);只關(guān)閉了寫;7五種I/O模型 阻塞I/O說明1:當(dāng)上層應(yīng)用app1調(diào)用recv系統(tǒng)調(diào)用時(shí),如果對(duì)等方?jīng)]有發(fā)送數(shù)據(jù)(緩沖區(qū)沒有數(shù)據(jù)),上層應(yīng)用app1將阻塞(默認(rèn)行為,被linux內(nèi)核阻塞);說明2:當(dāng)對(duì)等方發(fā)送了數(shù)據(jù),linux內(nèi)核recv端緩沖區(qū),有數(shù)據(jù)后,內(nèi)核會(huì)把數(shù)據(jù)copy給用戶空間。然后上層應(yīng)用app1解除阻塞,執(zhí)行下一步操作。非阻塞I/O說明1: 上

7、層應(yīng)用程序app2將套接字設(shè)置成非阻塞模式。說明2: 上層應(yīng)用程序app2輪詢調(diào)用recv函數(shù),接受數(shù)據(jù)。若緩沖區(qū)沒有數(shù)據(jù),上層程序app2不會(huì)阻塞,recv返回值為-1,錯(cuò)誤碼是EWOULDBLOCK。說明3:上層應(yīng)用程序不斷輪詢有沒有數(shù)據(jù)到來。會(huì)造成上層應(yīng)用忙等待。大量消耗CPU。很少直接用。應(yīng)用范圍小,一般和selectIO復(fù)用配合使用。I/O復(fù)用 說明1: 上層應(yīng)用程序app3調(diào)用select機(jī)制(該機(jī)制有l(wèi)inux內(nèi)核支持,避免了app3忙等待。),進(jìn)行輪詢文件描述符的狀態(tài)變化。說明2:當(dāng)select管理的文件描述符沒有數(shù)據(jù)(或者狀態(tài)沒有變化時(shí)),上層應(yīng)用程序app3也會(huì)阻塞。說明3

8、:好處select機(jī)制可以管理多個(gè)文件描述符說明4:select可以看成一個(gè)管理者,用select來管理多個(gè)IO。一旦檢測(cè)到的一個(gè)I/O或者多個(gè)IO,有我們感興事件,發(fā)生,select函數(shù)將返回,返回值為檢測(cè)到的事件個(gè)數(shù)。進(jìn)而可以利用select相關(guān)api函數(shù),操作具體事件。說明5:select函數(shù)可以設(shè)置等待時(shí)間,避免了上層應(yīng)用程序app3,長(zhǎng)期僵死。說明6: 和阻塞IO模型相比,selectI/O復(fù)用模型相當(dāng)于提前阻塞了。等到有數(shù)據(jù)到來時(shí),再調(diào)用recv就不會(huì)發(fā)生阻塞。信號(hào)驅(qū)動(dòng)I/O說明1: 上層應(yīng)用程序app4建立SIGIO信號(hào)處理程序。當(dāng)緩沖區(qū)有數(shù)據(jù)到來,內(nèi)核會(huì)發(fā)送信號(hào)告訴上層應(yīng)用程序

9、app4。說明2:上層應(yīng)用程序app4接收到信號(hào)后,調(diào)用recv函數(shù),因緩沖區(qū)有數(shù)據(jù),recv函數(shù)一般不會(huì)阻塞。說明3:這種用于模型用的比較少,屬于典型的“拉模式”。即:上層應(yīng)用app4,需要調(diào)用recv函數(shù)把數(shù)據(jù)拉進(jìn)來。異步I/O 說明1:上層應(yīng)用程序app5調(diào)用aio_read函數(shù),同時(shí)提交一個(gè)應(yīng)用層的緩沖區(qū)buf;調(diào)用完畢后,不會(huì)阻塞。上層應(yīng)用程序app5可以繼續(xù)其他任務(wù)。說明2:當(dāng)tcpip協(xié)議緩沖區(qū)有數(shù)據(jù)時(shí),linux主動(dòng)的把內(nèi)核數(shù)據(jù)copy到用戶空間。然后再給上層應(yīng)用app5發(fā)送信號(hào);告訴app5數(shù)據(jù)有了,趕快處理吧!說明3:典型的“推模式”說明4: 效率最高的一種形式,上層應(yīng)用程

10、序app5有異步處理的能力(在linux內(nèi)核的支持下,言外之意:處理其他任務(wù)的同時(shí),也可支持IO通訊)。異步I/O指的是什么?上層應(yīng)用程序app5,在也可以干別的活的時(shí),可以接收數(shù)據(jù)(接受異步通信事件。=)異步命令來源)。與信號(hào)驅(qū)動(dòng)IO模型,上層應(yīng)用程序app5不需要調(diào)用recv函數(shù)。結(jié)論:IO復(fù)用和異步IO是重點(diǎn)。8 I/O復(fù)用模型 select基本概念其他重要概念補(bǔ)充 阻塞IO 數(shù)據(jù)沒有準(zhǔn)備好, 讀操作就會(huì)阻塞 數(shù)據(jù)不能立即被收時(shí), 寫操作就會(huì)阻塞 打開文件時(shí)阻塞, 直到某些條件發(fā)生 非阻塞IO 立即返回, 并用錯(cuò)誤值來表示當(dāng)前的狀態(tài) 指定非阻塞方式 打開時(shí)指定O_NONBLOCK 標(biāo)志

11、使用fcntl 打開或關(guān)閉非阻塞方式 網(wǎng)絡(luò)編程時(shí), 使用非阻塞, 用輪詢方式發(fā)送 使用多線程可以避免使用非阻塞IO, 但是同步開銷較大多路IO 當(dāng)程序需要同時(shí)從兩個(gè)輸入讀數(shù)據(jù)時(shí) 使用多進(jìn)程/多線程, 同步復(fù)雜, 進(jìn)程線程開銷 使用非阻塞IO, 交替輪詢 通過信號(hào)使用異步IO, 無法判斷哪個(gè)IO完成 多路IO: 把關(guān)心的IO放入一個(gè)列表, 調(diào)用多路函數(shù) 多路IO函數(shù)阻塞, 直到有一個(gè)IO數(shù)據(jù)準(zhǔn)備好后返回 返回后告訴調(diào)用者哪個(gè)描述符準(zhǔn)備好了select()實(shí)現(xiàn)說明 調(diào)用select時(shí)通過參數(shù)告訴內(nèi)核用戶感興趣的IO描述符 關(guān)心的IO狀態(tài): 輸入,輸出或錯(cuò)誤 調(diào)用者等待時(shí)間 返回之后內(nèi)核告訴調(diào)用者多

12、個(gè)描述符準(zhǔn)備好了 哪些描述符發(fā)生了變化 調(diào)用返回后對(duì)準(zhǔn)備好的描述符調(diào)用讀寫操作 不關(guān)心的描述符集合傳NULLselect() /* According to POSIX 1003.1-2001 */#include /* According to earlier standards */#include #include #include int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 如果成功,返回所有sets中描述符的個(gè)數(shù);如果超時(shí),返回0;如

13、果出錯(cuò),返回-1。 監(jiān)視r(shí)eadfds來查看是否read的時(shí)候會(huì)被堵塞,注意,即便到了end-of-file,fd也是可讀的。 監(jiān)視writefds看寫的時(shí)候會(huì)不會(huì)被堵塞。 監(jiān)視exceptfd是否出現(xiàn)了異常。主要用來讀取OOB數(shù)據(jù),異常并不是指出錯(cuò)。 注意當(dāng)一個(gè)套接口出錯(cuò)時(shí),它會(huì)變得既可讀又可寫。 如果有了狀態(tài)改變,會(huì)將其他fd清零,只有那些發(fā)生改變了的fd保持置位,以用來指示set中的哪一個(gè)改變了狀態(tài)。 參數(shù)n是所有set里所有fd里,具有最大值的那個(gè)fd的值加1fd_set 四個(gè)宏用來對(duì)fd_set進(jìn)行操作: FD_CLR(int fd, fd_set *set); FD_ISSET(i

14、nt fd, fd_set *set); FD_SET(int fd, fd_set *set); FD_ZERO(fd_set *set); FD_ZERO用來清空set; FD_SET和FD_CLR用來對(duì)某個(gè)set添加和刪除一個(gè)fd; FD_ISSET用來指示一個(gè)fd是不是一個(gè)set的一部分。他很有用,用來看select后哪一個(gè)fd可用了。time_outn timeout是從調(diào)用開始到select返回前,會(huì)經(jīng)歷的最大等待時(shí)間。n 兩種特殊情況:如果為值為0,會(huì)立刻返回。n 如果timeout是NULL,會(huì)阻塞式等待。 struct timeval long tv_sec; /* seco

15、nds */ long tv_usec; /* microseconds */ ;n 一些調(diào)用使用3個(gè)空的set, n為zero, 一個(gè)非空的timeout來達(dá)到較為精確的sleep.n Linux中, select函數(shù)改變了timeout值,用來指示還剩下的時(shí)間,但很多實(shí)現(xiàn)并不改timeout。n 為了較好的可移植性,timeout在循環(huán)中需要被重新賦初值。 timeout= NULL 無限等待 被信號(hào)打斷時(shí)返回1, errno 設(shè)置成 EINTR timeout-tv_sec = 0 & tvptr-tv_usec = 0 不等待立即返回 timeout-tv_sec != 0 | tvp

16、tr-tv_usec != 0 等待特定時(shí)間長(zhǎng)度, 超時(shí)返回0select示例man 手冊(cè)select實(shí)現(xiàn)原理說明 fd_set是一個(gè)位向量, 每位表示一個(gè)描述符 int FD_ISSET(int fd, fd_set *fdset); 測(cè)試某個(gè)描述符是否在集合內(nèi) void FD_CLR(int fd, fd_set *fdset); 從集合內(nèi)把一個(gè)描述符移除 void FD_SET(int fd, fd_set *fdset); 把一個(gè)描述符加入集合 void FD_ZERO(fd_set *fdset); 清空描述符集合 可以把同一個(gè)描述符同時(shí)放取讀和寫集合 當(dāng)讀和寫者準(zhǔn)備好時(shí), 返回值的

17、計(jì)數(shù)分別加1次 普通文件的三種狀態(tài)總是返回準(zhǔn)備好的狀態(tài) 是否阻塞式IO不會(huì)影響select的結(jié)果 如果一個(gè)描述符到了文件結(jié)尾,select返回的狀態(tài)是準(zhǔn)備好 對(duì)一個(gè)準(zhǔn)備好的描述符, 讀出長(zhǎng)度是0表示到達(dá)結(jié)尾簡(jiǎn)單select語法用select完善echoclient用select完善echoserver套接字IO超時(shí)設(shè)置方法套接字I/O超時(shí)設(shè)置方法q alarmq 套接字選項(xiàng) q SO_SNDTIMEOq SO_RCVTIMEOq select鬧鐘方法alarm方案1void handler(int sig) return 0; /鬧鐘僅用來做打斷read操作,無其他用途/設(shè)置一個(gè)鬧鐘,5秒鐘以后打斷read函數(shù),達(dá)到超時(shí)的目的SIGALRMsignal(SIGALRM, handle);alarm(5)int ret = read(fd, buf, sizeof(buf);if (ret=-1 & errno=EINTR)errno = ETIMEDOUT;else if

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論