關於socket中的send函式

2021-06-04 06:03:21 字數 1366 閱讀 2588

關於send其實我是要呼叫send函式,但是在乙個地方看到了下面的一段話:

當呼叫該函式時,send先比較待傳送資料的長度len和套接字s的傳送緩衝區的長度,如果len大於s的傳送緩衝區的長度,該函式返回socket_error;如果len小於或者等於s的傳送緩衝區的長度,那麼send先檢查協議是否正在傳送s的傳送緩衝中的資料,如果是就等待協議把資料傳送完,如果協議還沒有開始傳送s的傳送緩衝中的資料或者s的傳送緩衝中沒有資料,那麼send就比較s的傳送緩衝區的剩餘空間和len,如果len大於剩餘空間大小send就一直等待協議把s的傳送緩衝中的資料傳送完,如果len小於剩餘空間大小send就僅僅把buf中的資料copy到剩餘空間裡(注意並不是send把s的傳送緩衝中的資料傳到連線的另一端的,而是協議傳的,send僅僅是把buf中的資料copy到s的傳送緩衝區的剩餘空間裡)。如果send函式copy資料成功,就返回實際copy的位元組數,如果send在copy資料時出現錯誤,那麼send就返回socket_error;如果send在等待協議傳送資料時網路斷開的話,那麼send函式也返回socket_error。要注意send函式把buf中的資料成功copy到s的傳送緩衝的剩餘空間裡後它就返回了,但是此時這些資料並不一定馬上被傳到連線的另一端。如果協議在後續的傳送過程中出現網路錯誤的話,那麼下乙個socket函式就會返回socket_error。

首先要理解的是,緩衝區有兩種。第一種是使用者定義的緩衝區,就是send裡的緩衝區引數。另一種就是套接字緩衝區,是由協議自定的。可以用getsockopt獲取其大小,並用setsockopt重置其大小。傳送的時候使用send實際上是從使用者緩衝區傳送到socket緩衝區中,至於資料真正何時傳送給另一端則是由協議規定的。recv也類似。

看了這段話之後,我使用windsock先獲取了socket緩衝區為8192,但是直接傳送10000的資料也不會阻塞,在我的機器上傳送23684時候阻塞,在別的機器上是不同的值,不知道內部是如何實現的。但是如果不斷傳送同時另一端也在接受,且使用者定義的接受緩衝區的大小大於8192的話,在之後的傳送過程中會每次填充8192;如果另一端使用者定義接受緩衝區小於8192,如1000則傳送端就會分開傳送,如3752一次,4440一次,並且之後都是這樣,加起來也是8192,就是不明白windsock的send的內部實現機制了。

之後問了師兄,師兄說按照unix下的send實現的話應該是先檢查使用者緩衝區是否大於socket傳送緩衝區,如果大於則分批次傳送,每次拷貝socket緩衝區大小之後傳送,傳送的時候socket緩衝區鎖定,傳送之後在從使用者緩衝區接受直至傳送完畢為止。如果小於則直接傳送。在socket緩衝區傳送的過程中這個緩衝區是鎖定的。

所以就不明白了,現在也用不到就不仔細查了,希望看到這個問題的高人給解釋下!先謝過。

Socket中send函式的理解

int send socket s,const char buf,int len,int flags 引數描述 同步socket 的send函式的執行流程如下 如果len大於傳送緩衝區剩餘空間大小 不足放入剩餘傳送緩衝區 send就一直 等待協議把s傳送緩衝區中的資料傳送完 如果len小於傳送緩衝區...

socket程式設計中send函式引發的執行緒退出

在多執行緒程式設計中其中使用乙個執行緒來accept要連線的客戶端。同時在接受client的請求之後新建乙個執行緒來進行具體的操作。其操作包括向client端傳送一定位元組的資料,使用send 函式來進行操作。如果在傳送過程 現任何乙個client端的斷線,則整個程式都會退出。ssize t sen...

socket中send函式和recv函式的理解

int send socket s,const char buf,int len,int flags 引數描述 同步 socket 的send函式的執行流程如下 如果len大於傳送緩衝區剩餘空間大小 不足放入剩餘傳送緩衝區 send就一直 等待協議把s傳送緩衝區中的資料傳送完 如果len小於傳送緩衝...