ssize_t send( SOCKET s, const char *buf, size_t len, int flags )
data_len
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 } }
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