Linux UDP socket 設(shè)置為的非阻塞模式與阻塞模式區(qū)別
Linux UDP socket 設(shè)置為的非阻塞模式與阻塞模式區(qū)別
UDP socket 設(shè)置為的非阻塞模式
Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen);
UDP socket 設(shè)置為的阻塞模式
Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), 0, (struct sockaddr *)&SockAddr,&ScokAddrLen);
Linux socket編程之阻塞套接字和非阻塞套接字
每一個TCP套接口有一個發(fā)送緩沖區(qū),可以用SO_SNDBUF套接口選項來改變這個緩沖區(qū)的大小。當(dāng)應(yīng)用進(jìn)程調(diào)用 write時,內(nèi)核從應(yīng)用進(jìn)程的緩沖區(qū)中拷貝所有數(shù)據(jù)到套接口的發(fā)送緩沖區(qū)。如果套接口的發(fā)送緩沖區(qū)容不下應(yīng)用程序的所有數(shù)據(jù)(或是應(yīng)用進(jìn)程的緩沖區(qū)大于套接口發(fā)送緩沖區(qū),或是套接口發(fā)送緩沖區(qū)還有其他數(shù)據(jù)),應(yīng)用進(jìn)程將被掛起(睡眠)。這里假設(shè)套接口是阻塞的,這是通常的缺省設(shè)置。內(nèi)核將不從write系統(tǒng)調(diào)用返回,直到應(yīng)用進(jìn)程緩沖區(qū)中的所有數(shù)據(jù)都拷貝到套接口發(fā)送緩沖區(qū)。因此從寫一個TCP套接口的write調(diào)用成功返回僅僅表示我們可以重新使用應(yīng)用進(jìn)程的緩沖區(qū)。它并不告訴我們對端的 TCP或應(yīng)用進(jìn)程已經(jīng)接收了數(shù)據(jù)。
TCP取套接口發(fā)送緩沖區(qū)的數(shù)據(jù)并把它發(fā)送給對端TCP,其過程基于TCP數(shù)據(jù)傳輸?shù)乃幸?guī)則。對端TCP必須確認(rèn)收到的數(shù)據(jù),只有收到對端的ACK,本端TCP才能刪除套接口發(fā)送緩沖區(qū)中已經(jīng)確認(rèn)的數(shù)據(jù)。TCP必須保留數(shù)據(jù)拷貝直到對端確認(rèn)為止。
1 輸入操作: read、readv、recv、recvfrom、recvmsg
如果某個進(jìn)程對一個阻塞的TCP套接口調(diào)用這些輸入函數(shù)之一,而且該套接口的接收緩沖區(qū)中沒有數(shù)據(jù)可讀,該進(jìn)程將被投入睡眠,直到到達(dá)一些數(shù)據(jù)。既然 TCP是字節(jié)流協(xié)議,該進(jìn)程的喚醒就是只要到達(dá)一些數(shù)據(jù):這些數(shù)據(jù)既可能是單個字節(jié),也可以是一個完整的TCP分節(jié)中的數(shù)據(jù)。如果想等到某個固定數(shù)目的數(shù)據(jù)可讀為止,可以調(diào)用readn函數(shù),或者指定MSG_WAITALL標(biāo)志。
既然UDP是數(shù)據(jù)報協(xié)議,如果一個阻塞的UDP套接口的接收緩沖區(qū)為空,對它調(diào)用輸入函數(shù)的進(jìn)程將被投入睡眠,直到到達(dá)一個UDP數(shù)據(jù)報。
對于非阻塞的套接口,如果輸入操作不能被滿足(對于TCP套接口即至少有一個字節(jié)的數(shù)據(jù)可讀,對于UDP套接口即有一個完整的數(shù)據(jù)報可讀),相應(yīng)調(diào)用將立即返回一個EWOULDBLOCK錯誤。
2 輸出操作:write、writev、send、sendto、sendmsg
對于一個TCP套接口,內(nèi)核將從應(yīng)用進(jìn)程的緩沖區(qū)到該套接口的發(fā)送緩沖區(qū)拷貝數(shù)據(jù)。對于阻塞的套接口,如果其發(fā)送緩沖區(qū)中沒有空間,進(jìn)程將被投入睡眠,直到有空間為止。
對于一個非阻塞的TCP套接口,如果其發(fā)送緩沖區(qū)中根本沒有空間,輸出函數(shù)調(diào)用將立即返回一個EWOULDBLOCK錯誤。如果其發(fā)送緩沖區(qū)中有一些空間,返回值將是內(nèi)核能夠拷貝到該緩沖區(qū)中的字節(jié)數(shù)。這個字節(jié)數(shù)也稱為不足計數(shù)(short count)
UDP套接口不才能在真正的發(fā)送緩沖區(qū)。內(nèi)核只是拷貝應(yīng)用進(jìn)程數(shù)據(jù)并把它沿協(xié)議棧向下傳送,漸次冠以UDP頭部和IP頭部。因此對一個阻塞的UDP套接口,輸出函數(shù)調(diào)用將不會因為與TCP套接口一樣的原因而阻塞,不過有可能會因其他的原因而阻塞。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Linux主機(jī)ssh使用秘鑰方式實現(xiàn)免登陸互通配置方式
實現(xiàn)多臺服務(wù)器間SSH免登陸的操作包括密鑰生成、配置與傳遞,首先在每臺主機(jī)上生成秘鑰,并將公鑰傳輸?shù)綄Ψ街鳈C(jī)的配置文件中,確保ssh服務(wù)開啟并且authorized_keys文件具有正確的權(quán)限,即可實現(xiàn)免登陸互通,其中可能遇到的問題通常跟文件權(quán)限有關(guān)2024-10-10Linux環(huán)境下Apache服務(wù)器配置二級域名的方法詳解
這篇文章主要介紹了Linux環(huán)境下Apache服務(wù)器配置二級域名的方法,結(jié)合具體實例形式較為詳細(xì)的分析了Linux環(huán)境下Apache服務(wù)器配置二級域名的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-07-07Windows10安裝linux子系統(tǒng)的兩種方式(圖文詳解)
這篇文章主要介紹了Windows10安裝linux子系統(tǒng)的兩種方式,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06APACHE支持.htaccess偽靜重寫出錯 No input file specified的解決方案
這篇文章主要介紹了APACHE支持.htaccess偽靜重寫出錯 No input file specified的解決方案,需要的朋友可以參考下2016-09-09linux系統(tǒng)虛擬主機(jī)開啟支持SourceGuardian(sg11)加密組件的詳細(xì)步驟
這篇文章主要介紹了linux系統(tǒng)虛擬主機(jī)開啟支持SourceGuardian(sg11)加密組件的詳細(xì)步驟,需要的朋友可以參考下2020-12-12