很多學員在使用send函式的時候,發現send總是能正常返回,看起來好像是「非阻塞」,其實它是阻塞的,以下**為證:
服務端:
#include #include #pragma comment(lib, "ws2_32.lib")
int main()
; int ret=recv(c, szrecvbuf, sizeof(szrecvbuf), 0);
printf("ret is %d, error is %d\n", ret, getlasterror());
} closesocket(c);
closesocket(s);
wsacleanup();
return 0;
}
客戶端:
#include #include #pragma comment(lib, "ws2_32.lib")
int main()
; int ret = send(s, szsend, sizeof(szsend), 0);
printf("ret is %d, error is %d\n", ret, getlasterror());
} closesocket(s);
wsacleanup();
return 0;
}
測試方法:1. 先執行服務端,再執行客戶端。
2. 在客戶端一直敲回車鍵,讓客戶端一直send, 多次操作後,發現不列印資訊了,說明send已經阻塞。
3.此時在服務端敲回車鍵,發現收到客戶端的資料,多次操作後,發現不列印資訊了,說明已經無資料可接收。
4.此時在客戶端敲,發現又可以傳送了,說明send阻塞解除了。
Tcp send阻塞問題
如果傳送快取大小比請求傳送的大小要大,那麼send函式立即返回,同時向網路中傳送資料 否則,send會等待接收端對之前傳送資料的確認,以便騰出快取空間容納新的待傳送資料 參考鏈結 步驟 1 修改接收端,傳送端的系統緩衝區大小 echo 10000000 proc sys net core wmem ...
TCP send 阻塞與非阻塞
原文連線 tcp協議本身是可靠的,並不等於應用程式用tcp傳送資料就一定是可靠的.不管是否阻塞,send傳送的大小,並不代表對端recv到多少的資料.在阻塞模式 下,send函式的過程是將應用程式請求傳送的資料拷貝到傳送快取中傳送就返回.但由於傳送快取的存在,表現為 如果傳送快取大小比請求傳送的大小...
PC會消亡嗎?
當我開啟我的台式電腦,準備上網瀏覽網頁和寫點部落格。我發現我犯了乙個錯誤 做這些事為什麼要開台式電腦呢?要知道我的台式電腦有2.33ghz的主處理器,4g的記憶體。用這樣配置的電腦來做這些事不是殺雞用牛刀嗎?這完全可以用我的平板電腦來做。這促使我思考一些問題 電子裝置小型化的驅動力在 人們購買手機 ...