客戶端使用
m_socket = socket(AF_INET, SOCK_STREAM, 0);
return INVALID_SOCKET == m_socket ? false : true ;
創建了1萬個套接字,確保每次都是成功的,然后用
sockaddr_in addSvr;
addSvr.sin_family = AF_INET;
addSvr.sin_addr.s_addr = inet_addr(pchIp);
addSvr.sin_port = htons(iPort);
int iReturnValue = connect(m_socket, (SOCKADDR *)&addSvr, sizeof(addSvr));
if (SOCKET_ERROR == iReturnValue)
{
return false;
}
return true;
進行連接,如果這個套接字連接失敗的話,會有機制等一會在這個套接字上重新connect,直到客戶端這1萬個套接字全部連接成功,可為什么服務端accept統計的數量卻總達不到一萬呢。
我自己初步研究了一下,如果服務端只要進行了listen呼叫,就算不呼叫任何accept,客戶端也有那么幾個是可以connect成功的,這說明connect的回傳值和accept并沒有直接關系,也就是說connect回傳成功了,但并不代表服務端就已經accept。
大家幫忙分析一下這種現象正常不,正常和不正常分別是因為什么。
如果正常,那么為什么成功connect了1萬個,而服務端卻accept不到一萬個呢,丟失的這些鏈接是什么情況。
有什么辦法確保我確實是創建了1萬個TCP連接呢,當然在應用層進行一次send/recv,在recv之后計數應該比較準確,有沒有其它的什么辦法呢。
另外,listen(m_listenSocket, 5)如果我把listen的第二個引數填大一點,比如100,上面的現象會好很多,連著測了幾次沒問題,而且會很快,但感覺這是個經驗值,Svr跑在不同的環境下總不會總需要調吧。
uj5u.com熱心網友回復:
百度搜相關關鍵字。uj5u.com熱心網友回復:

connect 成功。最好的辦法是回傳點資料。比如連接成功,服務器發送給客戶端一個conn連接數。這個才是你實際accept成功的連接數
uj5u.com熱心網友回復:
一 不同的windows作業系統下每個行程能支持的最大連接數是不同的,即使是Linux/Unix也有個上限,除非你編譯系統的時候調整引數二 如果是server 2008以上版本,系統tcp/ip協議堆疊有個輔助處理功能,也就是系統提前在ip層自動進行了連接成功處理,即使實際上對應的套接字行程還沒有被應用層accept
三 如果你對沒有連接成功的套接字沒有及時reset,那么會很快耗光系統資源,主要是不可分片記憶體
uj5u.com熱心網友回復:
客戶接入后,就發送個序號資料給服務器,服務器連接成功后,向接入的客戶端同樣送個序號資料,檢查雙方的序號是否一致(如果多臺客戶端電腦,就把發送的序號加起來)
uj5u.com熱心網友回復:
呼叫connect成功只能說明三次握手成功,對方成功回復你connect的ACK包,與accept無關轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/68631.html
標籤:網絡編程
上一篇:求助,在VC上對mapinfo進行二次開發,如何實作對圖元資訊的編輯即資訊工具按鈕
下一篇:雙機通信問題
