send+recv注意事項


send

函數原型

  • ssize_t send( SOCKET s, const char *buf, size_t len, int flags )

注意事項

  • 待發送數據長度data_len
  • 套接字s的發送緩衝長度buf_len
  • 發送緩衝區剩餘空間space_len
if(data_len > buf_len)
    return SOCKET_ERROR
else{
    if(協議正在發s緩衝中的數據)
      等待發送完成
    else{
        if(data_len > space_len)
            等待協議把s的數據發送完
            //除send外的socket函數開始前都要等發送緩衝區清空
            if(發送時網絡斷開)
                return SOCKET_ERROR
        else
            if(把buf中的數據複製到剩餘空間 == success)
                return 實際複製的字節數
                //此時數據還沒由協議發送到另外一端
                //等待傳輸時斷網,調用send的進程會收到SIGPIPE
            else
                return SOCKET_ERROR
    }
}

recv

函數原型

ssize_t recv(int s, char *buf, size_t len, int flags)socket

注意事項

while(s發送緩衝區的數據正在被協議傳輸)
    if(網絡錯誤)    return SOCKET_ERROR
while(s接收緩衝區沒有數據 || 正在接數據)
    continue
if(複製s接收緩衝區數據到buf == success)
   if(在等待協議接收數據的時候網絡中斷)
       return 0
   else//大於buf的長度就要分屢次接收了
       return 實際複製的字節數
else 
    return SOCKET_ERROR

彙總

  • 上面的過程只是爲了揭示其中的注意事項,實際實現要複雜更多
  • 從上面的描述能夠看出,接收和發送數據的主體都是協議,而不是send和recv
  • 因此纔會有send成功了並不表明數據就真的發送到另外一端的說法
相關文章
相關標籤/搜索