套接字 對send 和recv 的理解1

2021-09-06 08:31:22 字數 1229 閱讀 5611

socket是一種通用的網路程式設計介面。

當呼叫函式socket時,成功後返回建立的套接字描述符。

說明:當呼叫socket建立乙個套接字時,它是由輸入和輸出緩衝區的,在核心中。當將該套接字設定成監聽模式後,傳送緩衝區不再用,而輸入緩衝區只能放客戶端的連線請求。而accept函式返回的新的已建立連線的套接字是有那兩個緩衝區的,因為伺服器要通過它與客戶端通訊。

當呼叫socket函式建立了乙個套接字,系統會在核心空間自動生成乙個結構體,作業系統會自動給該套接字開闢乙個接收緩衝區和乙個傳送緩衝區。

當執行send時,成功地完成

send()

呼叫並不意味著資料傳送到達,而僅僅完成了將使用者定義的緩衝區buffer中的資料拷貝到套接字的接收緩衝區,如果傳送系統的緩衝區空間不夠儲存需傳送的資料,除非套介面處於非阻塞i/o方式,否則send()將阻塞。這只是完成了應用層的工作,剩下的工作有tcp/ip模型的剩下的層來完成。

同理,

(1)recv先等待sockfd的傳送緩衝中的資料被協議傳送完畢,如果協議在傳送sockfd的傳送緩衝中的資料時出現網路錯誤,那麼recv函式返回socket_error,

(2)如果sockfd的傳送緩衝中沒有資料或者資料被協議成功傳送完畢後,recv先檢查套接字sockfd的接收

緩衝區,如果sockfd接收緩衝區中沒有資料或者協議正在接收資料,那麼recv就一直等待,直到協議把資料接收完畢。當協議把資料接收完畢,recv函式就把sockfd的接收緩衝中的資料copy到buf中(注意協議接收到的資料可能大於buf的長度,所以在這種情況下要呼叫幾次recv函式才能把sockfd的接收緩衝中的資料copy完。recv函式僅僅是copy資料,真正的接收資料是協議來完成的),recv函式返回其實際copy的位元組數。如果recv在copy時出錯,那麼它返socket_error;如果recv函式在等待協議接收資料時網路中斷了,那麼它返回0。

注意:在unix系統下,如果recv函式在等待協議接收資料時網路斷開了,那麼呼叫recv的程序會接收到乙個sigpipe訊號,程序對該訊號的預設處理是程序終止。

recv和send的真正作用

區分應用層的 recv send 和核心中套接字的真正讀取資料,要知道,tcp協議層是執行與核心當中,而通訊是網絡卡直接的通訊,因此,不要認為,沒有呼叫 recv 就不會有資料,不管調沒呼叫 recv 只要對方 send 線路上有資料,那麼,協議就會從網絡卡裡面讀取該資料進核心的 socket 緩衝...

改寫你的recv和send函式

tcp是基於位元組流的,你向send或者recv提交乙個buffer,它不一定幫你傳送或者接收完這個buffer的,所以你應該自己改寫一下這兩個函式,以便符合應用的需要,改寫後姑且命名為tcpsend,tcprecv 下面我改寫後的這兩個函式的實現 int tcpsend socket s,cons...

socket的recv和send帶來的疑惑

昨天在測試socket的傳輸時,發現有時候recv會會返回接收位元組的長度為0,開始沒有在意,但是過了一會系統重啟了。這樣一來帶來的麻煩就大了。因為發現每次系統重啟時,都在send函式附近,為了驗證在send時系統重啟,於是在send函式前後各加了乙個列印輸出,發現每次都是在第乙個列印有輸出,第二個...