1. 程式人生 > >linux c 下的 tcp的recv函式和udp的recvfrom函式 引數對比

linux c 下的 tcp的recv函式和udp的recvfrom函式 引數對比

(1)recv先等待s的傳送緩衝中的資料被協議傳送完畢,如果協議在傳送s的傳送緩衝中的資料時出現網路錯誤,那麼recv函式返回SOCKET_ERROR; (2)如果s的傳送緩衝中沒有資料或者資料被協議成功傳送完畢後,recv先檢查套接字s的接收緩衝區,如果s接收緩衝區中沒有資料或者協議正在接收資料,那麼recv就一直等待,直到協議把資料接收完畢。當協議把資料接收完畢,recv函式就把s的接收緩衝中的資料copy到buf中(注意協議接收到的資料可能大於buf的長度,所以在這種情況下要呼叫幾次recv函式才能把s的接收緩衝中的資料copy完。recv函式僅僅是copy資料,真正的接收資料是協議來完成的); recv函式返回其實際copy的位元組數。如果recv在copy時出錯,那麼它返回SOCKET_ERROR;如果recv函式在等待協議接收資料時網路中斷了,那麼它返回0。 注意:在Unix系統下,如果recv函式在等待協議接收資料時網路斷開了,那麼呼叫recv的程序會接收到一個SIGPIPE訊號,程序對該訊號的預設處理是程序終止。   recvfrom函式(經socket接收資料): 函式原型:int recvfrom(SOCKET s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen); 相關函式 recv,recvmsg,send,sendto,socket 函式說明:
recv()
用來接收遠端主機經指定的socket傳來的資料,並把資料傳到由引數buf指向的記憶體空間,引數len為可接收資料的最大長度.引數flags一般設0,其他數值定義參考recv().引數from用來指定欲傳送的網路地址,結構sockaddr請參考bind()函式.引數fromlen為sockaddr的結構長度.