socket中send函數和recv函數的理解

int send(SOCKET s,  const char *buf,    int len,    int flags);

 

參數描述:

  • SOCKET s         發送端套接字描述符
  • const char *buf  應用程序要發送的數據的緩衝區(想要發送的數據)
  • int len          實際要發送的字節數
  • int flags        一般置爲0即可

同步Socketsend函數的執行流程如下:


  • 調用該函數時,send先比較待發送數據的長度len與套接字s發送緩衝區的長度(區別於buf),如果len大於s的發送緩衝區的長度,則函數返回SOCKET_ERROR
  • 如果len小於或者等於s發送緩衝區的長度,那麼send先檢查協議是否正在發送s的發送緩衝區中的數據:                                                                                                       a.如果是在發送,就等待協議將數據發送完畢。                                                      b.如果沒有開始發送s的緩衝區中的數據,那麼send就比較s的發送緩衝區的剩餘空間和len的大小                 

如果len大於發送緩衝區剩餘空間大小(不足放入剩餘發送緩衝區)send就一直 等待協議把s發送緩衝區中的數據發送完;

如果len小於發送緩衝區剩餘空間大小,就僅僅把buf中的數據copy到發送緩衝區的剩餘空間裏(send函數返回時並不代表sends的緩衝區的數據(buf)傳到連接的另一端,而是協議傳輸的,send僅僅是把buf中的數據copys的發送緩衝區的剩餘空間中) 

Socket中send函數的理解(一)如果send函數copy數據成功,就返回實際copy的字節數,如果sendcopy數據時出現錯誤,那麼send就返回SOCKET_ERROR;如果send在等待協議傳送數據時斷開網絡,那麼send函數也返回SOCKET_ERROR

  • 要注意send函數把buf中的數據成功copys的發送緩衝的剩餘空間後就返回了,但是此時這些數據並不一定馬上被傳到連接的另一端。如果協議在後續的傳送過程中出現網絡錯誤的話,那麼下一個Socket函數就會返回SOCKET_ERROR.(每一個除send之外的Socket函數在執行的最開始總要先等待套接字的發送緩衝區中的數據被協議傳送完畢才能繼續,如果在等待時出現網絡錯誤,那麼該Socket函數就返回SOCKET_ERROR)

 

recv函數:

 

int recv (SOCKET s, char* buf   ,int len,   int flags);參數描述:

  • SOCKET s         發送端套接字描述符
  • const char *buf  應用程序存放接收的數據的緩衝區
  • int len          buf的長度
  • int flags        一般置爲0即可

同步Socketrecv函數的執行流程如下:


  • 調用recv函數時,recv先等待s的發送緩衝區中的數據被協議發送完畢:                                                                                                                               a.如果協議在傳送s的發送緩衝區中的數據時出現網絡錯誤,那麼recv函數返回SOCKET_ERROR              b.如果s的發送緩衝區中的數據被協議成功發送完畢或者沒有數據時,recv先檢查套接字s的接收緩衝區的情況:                                                                                                                                                                                             如果s接收緩衝區中沒有數據或者協議正在接收數據,那麼recv就一直等待,直到協議把數據接收完畢。當協議把數據接收完畢,recv函數就把s的接收緩衝區中的數據copybuf(注意協議接收到的數據可能大於buf的長度,所以在這種情況下要調用幾次recv函數才能把s的接收緩衝中的數據copy完。recv函數僅僅是copy數據,真正接收數據是協議來完成的)recv函數返回其實際copy的字節數。                                                                                                             Socket中send函數的理解(一)如果recvcopy時出錯,那麼它返回SOCKET_ERROR;如果recv函數在等待協議接收數據時網絡中斷了,那麼它返回0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章