1. 程式人生 > >TCP與UDP的Send和Recv

TCP與UDP的Send和Recv

Linux Socket TCP Send的返回值>0是表示已經發送了的位元組數(未被確認的),例如要傳送10個位元組,在非同步模式下返回值為5個位元組,則表示已經Copy了5個位元組到傳送緩衝區,系統隨後會發送這些資料,但這5個位元組是未被確認的,也就是還沒收到接收方的Ack,如果伺服器無迴應或網路斷開,那麼系統將會不斷重發該資料包,直到收到這5個位元組的Ack.而剩下的5個未發的位元組則由應用程式呼叫Send再發.若返回值為0則表示伺服器已主動斷開連線,也就是已收到了伺服器發過來的Fin或者Rst.若返回值等於-1的話,並且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN),則表示系統在忙或者傳送緩衝區已滿了,但連線是正常的,可以稍後再嘗試發.否則表示連線發生異常,連線已斷開,無效描述符之類的. UDP的sendto對應著recvfrom,一發一收.如果sendto的資料大於MTU,則會在IP層分片傳送,到達目標後由IP層重組,再從recvfrom一次性返回.如果使用IP層分片重組則存在亂序,丟包,重包的問題.呼叫一次sendto,只要資料長度小於MTU都會以一個獨立的UDP包傳送.recvfrom的接收大小必須大於或等於sendto時的是資料大小.更正確的說法應該是UDP的包單位是以IP層的包為單位的.