前言
- socket在默認情況下是阻塞狀態的,這就使得發送和接受都處於阻塞狀態;
- TCP協議下發送選用
send,UDP協議下,發送選用sendto. - TCP協議下接收選用
recv,UDP協議下,接收選用recvfrom.
一、阻塞模式&&send
假設發送緩沖區大小為4096KB,其中已經使用4000KB空間,剩余96KB空間;現在又有200KB的數據需要發送,則只能先將96KB的數據放入發送緩沖區但不發送(阻塞),直到緩沖區空出空間足夠放入剩余104KB,再send操作將這200子節發送,返回發送成功字節數200;
二、非阻塞&&send
與阻塞不同,非阻塞模式,發送緩沖區得到數據會立即發送,例:當緩沖區只有96KB空間,但要發送200KB數據要進入發送緩沖區,則直接調用send並返回成功字節數96,並不等待將剩余的104字節放入緩沖區同時發送;
三、阻塞/阻塞模式&&sendto
UDP的sendto並不能阻塞發送,因為UDP並沒有真正的發送緩沖區,它所做的只是將應用緩沖區拷貝給下層協議棧,在此過程中加上UDP頭,IP頭,所以實際不存在阻塞。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
四、阻塞模式&&recv
將會阻塞到發送緩沖區至少 1 個字節,才返回;
在沒有數據到來時,對它們的調用都將處於睡眠狀態,不會返回。
五、阻塞模式&& recvfrom
將會阻塞到發送緩沖區至少一個完整的UDP數據報,才返回;
在沒有數據到來時,對它們的調用都將處於睡眠狀態,不會返回。
六、阻塞模式 / 非阻塞模式&&recv
如果緩沖區 有任何一個字節數據(TCP)或者一個完整UDP數據報,它們將會返回接收到的數據大小。而如果沒有任何數據則返回錯誤 WSAEWOULDBLOCK/E WOULDBLOCK。
