阻塞與非阻塞個(gè)人小結(jié).doc_第1頁(yè)
阻塞與非阻塞個(gè)人小結(jié).doc_第2頁(yè)
阻塞與非阻塞個(gè)人小結(jié).doc_第3頁(yè)
阻塞與非阻塞個(gè)人小結(jié).doc_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

阻塞與非阻塞個(gè)人小結(jié)最近幫一哥們做一個(gè)簡(jiǎn)單的通信演示小程序,重拾遺忘很久的Windows網(wǎng)絡(luò)編程,通過(guò)此次演示程序的制作,對(duì)于TCP的三路握手、Socket的運(yùn)用理解更加深入了,同時(shí)從文字上的阻塞與非阻塞到情真意切的感受到二者之間的差異,閑暇之余,發(fā)現(xiàn)一本好書(shū),書(shū)名好像叫“WIn32多線程”,書(shū)中用例與講解很貼切。下面對(duì)阻塞非阻塞做一小結(jié),其中有部分內(nèi)容參考于網(wǎng)絡(luò),也許只有親身體驗(yàn)過(guò)的人才能感覺(jué)到這平白的總結(jié)中蘊(yùn)含的種種細(xì)節(jié)與痛苦的實(shí)踐。1.connect函數(shù)響應(yīng)中斷返回后仍然回到函數(shù)的調(diào)用。實(shí)踐證明,對(duì)于一個(gè)非阻塞的socket,如果在調(diào)用connect函數(shù)時(shí),如果發(fā)生中斷,這函數(shù)響應(yīng)中斷,但當(dāng)中斷返回時(shí),繼續(xù)connect函數(shù)的調(diào)用,直到connect超時(shí)失敗或接收到錯(cuò)誤ICMP包或連接成功2.accept()如果偵聽(tīng)進(jìn)程是非阻塞模式工作,當(dāng)調(diào)用accept()函數(shù)接收來(lái)自客戶端的請(qǐng)求后,返回的socket套接字,默認(rèn)為阻塞的工作模式。一、阻塞模型可能發(fā)生阻塞的套接口調(diào)用分為四種:1.輸入操作:read、readv、recv、recvfrom和recvmsg函數(shù)2.輸出操作:write、writev、send、sendto和sendmsg函數(shù)3.接收外來(lái)連接:accept()函數(shù)4.初始化外出的連接:connect()函數(shù)二、I/O模型1.阻塞I/O2.非阻塞I/O3.I/O復(fù)用(select函數(shù))4.信號(hào)驅(qū)動(dòng)I/O(SIGIO)5.異步I/O三、I/O復(fù)用模型的應(yīng)用場(chǎng)合1.當(dāng)客戶處理多個(gè)描述字時(shí)(一般是交互式輸入和網(wǎng)絡(luò)套接口),必須使用I/O復(fù)用。2.一個(gè)客戶同時(shí)處理多個(gè)套接口3.如果一個(gè)TCP服務(wù)器既要處理偵聽(tīng)套接口,又要處理已連接套接口,一般也要用到I/O復(fù)用。4.如果一個(gè)服務(wù)器既要處理TCP,又要處理UDP,一般也要使用I/O復(fù)用。5.如果一個(gè)服務(wù)器要處理多個(gè)服務(wù)或者多個(gè)協(xié)議(inetd守護(hù)進(jìn)程)。四、拒絕服務(wù)型攻擊服務(wù)器某一個(gè)時(shí)刻阻塞于只處理單個(gè)客戶,而不能處理其他客戶的需求,這就導(dǎo)致了拒絕服務(wù)型攻擊,可能的解決辦法是:(a)使用非阻塞I/O模型;(b)讓每個(gè)客戶由單獨(dú)的控制線程提供服務(wù)(例如,創(chuàng)建子進(jìn)程或線程來(lái)為每個(gè)客戶提供服務(wù));(c)對(duì)I/O操作設(shè)置超時(shí)。五、connect()函數(shù)1.阻塞模式客戶端調(diào)用connect()函數(shù)將激發(fā)TCP的三路握手過(guò)程,但僅在連接建立成功或出錯(cuò)時(shí)才返回。返回的錯(cuò)誤可能有以下幾種情況:1.如果TCP客戶端沒(méi)有接收到SYN分節(jié)的響應(yīng),則返回ETIMEDOUT,阻塞模式的超時(shí)時(shí)間在75秒(4.4BSD內(nèi)核)到幾分鐘之間。2.如果對(duì)客戶的SYN的響應(yīng)時(shí)RST,則表明該服務(wù)器主機(jī)在我們指定的端口上沒(méi)有進(jìn)程在等待與之連接(例如服務(wù)器進(jìn)程也許沒(méi)有啟動(dòng)),這稱為硬錯(cuò),客戶一接收到RST,馬上就返回錯(cuò)誤ECONNREFUSED.3.如果某客戶發(fā)出的SYN在中間的路由器上引發(fā)了一個(gè)目的地不可達(dá)ICMP錯(cuò)誤,多次嘗試發(fā)送失敗后返回錯(cuò)誤號(hào)為EHOSTUNREACH或ENETUNREACH.附加:產(chǎn)生RST的三種情況,一是SYN到達(dá)某端口但此端口上沒(méi)有正在偵聽(tīng)的服務(wù)器、二是TCP想取消一個(gè)已有連接、三是TCP接收了一個(gè)根本不存在的連接上的分節(jié)。2.非阻塞模式采用非阻塞的工作模式要考慮一下兩種情況:1.如果是連接本機(jī),則調(diào)用connect()函數(shù)會(huì)立刻建立。2.如果服務(wù)器是網(wǎng)絡(luò)中的用戶,則調(diào)用connect()函數(shù)需要從幾個(gè)毫秒的局域網(wǎng)到幾百毫秒或幾秒的廣域網(wǎng)。并且函數(shù)會(huì)立刻返回EINPROCESS錯(cuò)誤,但TCP通信的三路握手過(guò)程正在進(jìn)行,所以可以使用select函數(shù)來(lái)檢查這個(gè)連接是否建立成功。源自Berkeley的實(shí)現(xiàn)有兩條與select函數(shù)和非阻塞相關(guān)的規(guī)則:1.當(dāng)連接成功建立時(shí),描述字變成可寫(xiě)。2.當(dāng)連接建立出錯(cuò)時(shí),描述字變成即可讀又可寫(xiě)。六、accept()函數(shù)1.阻塞模式如果在一個(gè)阻塞套接口上調(diào)用accept()函數(shù),而且沒(méi)有新的連接,進(jìn)程會(huì)進(jìn)入睡眠狀態(tài)。2.非阻塞模式如果在一個(gè)非阻塞套接口上調(diào)用accept()函數(shù),而且沒(méi)有新的連接,將返回EWOULDBLOCK錯(cuò)誤。3.一種非阻塞模式例子的問(wèn)題及解決辦法問(wèn)題描述:在服務(wù)器端偵聽(tīng)套接口采用阻塞的方式工作,并且使用select檢測(cè)是否有已經(jīng)建立起的連接,如果有則調(diào)用accept()函數(shù)接收該連接,問(wèn)題是如果客戶端首先調(diào)用connect()函數(shù)連接服務(wù)器后立刻又調(diào)用close()函數(shù)關(guān)閉該連接,而在服務(wù)器端,在select()函數(shù)返回和調(diào)用accept()函數(shù)之間,接收到客戶端的斷開(kāi),則會(huì)刪除該套接口在已連接套接口中的內(nèi)容,所以服務(wù)器將會(huì)阻塞在accept()函數(shù),直到有客戶連接才返回。解決辦法:(1).如果用select來(lái)獲知何時(shí)有連接已就緒可以accept時(shí),總是把偵聽(tīng)套接口置為非阻塞,同時(shí)(2).在后面的accept調(diào)用中忽略以下錯(cuò)誤:EWOULDBLOCK(Berkeley的實(shí)現(xiàn)在客戶放棄連接時(shí)出現(xiàn)的錯(cuò)誤)、ECONNABORTED(Posix.1g的實(shí)現(xiàn)在客戶放棄連接時(shí)出現(xiàn)的錯(cuò)誤)、EPROTO(SVR4的實(shí)現(xiàn)在客戶放棄連接時(shí)出現(xiàn)的錯(cuò)誤)和EINTR(如果信號(hào)被捕獲)。七、select()函數(shù)select()函數(shù)準(zhǔn)備好讀的條件:1.套接口有數(shù)據(jù)可讀2.該連接的讀這一半關(guān)閉(也就是接收了FIN的TCP連接)。對(duì)這樣的套接口進(jìn)行讀操作將不阻塞并返回0(也就是返回EOF)。3.該套接口是一個(gè)偵聽(tīng)套接口且已完成的連接數(shù)不為0。4.其上有一個(gè)套接口錯(cuò)誤待處理,對(duì)這樣的套接口的讀操作將不阻塞并返回-1,并設(shè)置errno,可以通過(guò)設(shè)置SO_ERROR選項(xiàng)調(diào)用getsockopt函數(shù)獲得。select()函數(shù)準(zhǔn)備好寫(xiě)的條件:1.套接口有可用于寫(xiě)的空間。2.該連接的寫(xiě)這一半關(guān)閉,對(duì)這樣的套接口進(jìn)行寫(xiě)操作將產(chǎn)生SIGPIPE信號(hào)。3.該套接口使用非阻塞的方式connect建立連接,并且連接已經(jīng)異步建立,或則connect已經(jīng)以失敗告終。4.其上有一個(gè)套接口錯(cuò)誤待處理。八、read()函數(shù)和recv函數(shù)read()函數(shù)返回值代表的意義:1.如果對(duì)方TCP發(fā)送數(shù)據(jù),則套接口就變?yōu)榭勺x且read返回大于0的值(即數(shù)據(jù)的字節(jié)數(shù))。2.如果對(duì)方TCP發(fā)送一個(gè)FIN(對(duì)方進(jìn)程終止),套接口就變?yōu)榭勺x且read返回0(文件結(jié)束)。3.如果對(duì)方TCP發(fā)送一個(gè)RST(對(duì)方主機(jī)崩潰并重新啟動(dòng)),套接口就變成可讀且read返回-1,返回的錯(cuò)誤號(hào)errno為ECONNRESET。九、write()函數(shù)和send函數(shù)如果向一個(gè)接收了FIN的套接字進(jìn)行寫(xiě)操作是可行的,但如果向一個(gè)接受了RST的套接字進(jìn)行寫(xiě)操作則是致命的,內(nèi)核會(huì)向該進(jìn)程發(fā)送一個(gè)SIGPIPE信號(hào),返回EPIPO,該錯(cuò)誤類型默認(rèn)為終止進(jìn)程。SIGPIPE信號(hào)向一個(gè)接受了RST的套接字進(jìn)行寫(xiě)操作時(shí),內(nèi)核會(huì)向該進(jìn)程發(fā)送一個(gè)SIGPIPE信號(hào),該信號(hào)的缺省行為是終止進(jìn)程,因此進(jìn)程必須捕獲它以免被不情愿的終止。5、 Linux中Socket的數(shù)據(jù)結(jié)構(gòu)(1) struct sockaddr /用于存儲(chǔ)套接字地址unsigned short sa_family;/地址類型char sa_data14; /14字節(jié)的協(xié)議地址;(2) struct sockaddr_in /in 代表internetshort int sin_family; /internet協(xié)議族unsigned sh

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論