日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

从缓冲上看阻塞与非阻塞socket在发送接收上的区别(转载)

發布時間:2025/3/15 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从缓冲上看阻塞与非阻塞socket在发送接收上的区别(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://blog.chinaunix.net/uid-24517549-id-4044877.html 首先socket在默認情況下是阻塞狀態的,這就使得發送以及接收操作處于阻塞的狀態,即調用不會立即返回,而是進入睡眠等待操作完成。

??一.發送選用send(這里特指TCP)以及sendto(這里特指UDP)來描述

??? 首先需要說明的是,不管阻塞還是非阻塞,在發送時都會將數據從應用緩沖區拷貝到內核緩沖區(SO_RCVBUF選項聲明,除非緩沖區大小為0)。?

??? 在阻塞模式下send操作將會等待所有數據均被拷貝到發送緩沖區后才會返回。

??? 如果當前發送緩沖總大小為8192,已經拷貝到緩沖的數據為8000,那剩余的大小為192,現在需要發送2000字節數據,那阻塞發送就會等待緩沖區足 夠把所有2000字節數據拷貝進去,如第一次拷貝進192字節,當緩沖區成功發送出1808字節后,再把應用緩沖區剩余的1808字節拷貝到內核緩沖,而 后send操作返回成功發送字節數。

??? 從上面的過程不難看出,阻塞的send操作返回的發送大小,必然是你參數中的發送長度的大小。

????在阻塞模式下的sendto操作不會阻塞。

??? 關于這一點的原因在于:UDP并沒有真正的發送緩沖區,它所做的只是將應用緩沖區拷貝給下層協議棧,在此過程中加上UDP頭,IP頭,所以實際不存在阻塞。

????在非阻塞模式下send操作調用會立即返回。

??? 關于立即返回大家都不會有異議。還是拿阻塞send的那個例子來看,當緩沖區只有192字節,但是卻需要發送2000字節時,此時調用立即返回,并得到返 回值為192。從中可以看到,非阻塞send僅僅是盡自己的能力向緩沖區拷貝盡可能多的數據,因此在非阻塞下send才有可能返回比你參數中的發送長度小 的值。

??? 如果緩沖區沒有任何空間時呢?這時肯定也是立即返回,但是你會得到WSAEWOULDBLOCK/E WOULDBLOCK 的錯誤,此時表示你無法拷貝任何數據到緩沖區,你最好休息一下再嘗試發送。

????在非阻塞模式下sendto操作 不會阻塞(與阻塞一致,不作說明)。

?

??二.接收選用recv(這里特指TCP)以及recvfrom(這里特指UDP)來描述

????在阻塞模式下recv,recvfrom操作將會阻塞?到緩沖區里有至少一個字節(TCP)或者一個完整UDP數據報才返回。

??? 在沒有數據到來時,對它們的調用都將處于睡眠狀態,不會返回。

????在非阻塞模式下recv,recvfrom操作將會立即返回。

??? 如果緩沖區?有任何一個字節數據(TCP)或者一個完整UDP數據報,它們將會返回接收到的數據大小。而如果沒有任何數據則返回錯誤?WSAEWOULDBLOCK/E WOULDBLOCK。

轉載于:https://www.cnblogs.com/lance-ehf/p/3812348.html

總結

以上是生活随笔為你收集整理的从缓冲上看阻塞与非阻塞socket在发送接收上的区别(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。