linux 套接字函數send和recv函數(阻塞模式)

send函數的流程:

  • buffer的內容 —->linuxTCP協議棧發送緩存區—->內核發送

  • 什麼情況下,buffer內容纔會先寫入協議緩存區呢 ,協議緩存區有一個SO_SNDLOWAT最低位標誌,表示緩存區有空間了, 一般是2048字節。就是說緩存區至少2048字節剩餘空間,你才能繼續向緩存區寫。selcet /epoll等監視內核,就是依據這個,判斷socket是否可以向緩存區寫數據,就是產生可寫事件

recv函數的流程:

  • 內核接受遠端數據—–>存到linux TCP協議接收緩存區—–>copy到buffer裏面(同時要清除協議緩存區)

  • 什麼情況下可以讀取數據呢, 協議緩存區有一個SO_RCVLOWAT 最低水位標誌,表示緩存區有數據了,你可以讀取了,這個值是1字節。如果你給的buffer一次性讀取不完,就要循環讀取,直到讀取返回EAGAIN,就表示讀完了,返回0表示socket已關閉。所以讀取一般是while循環。select/epoll 等就是靠內核監視,這個協議緩衝區有沒有數據,產生是否有了可讀事件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章