一、為什麼使用非阻塞connect
tcp連線的建立涉及乙個在三路握手過程,阻塞的connect一直等到客戶收到自己的syn的ack才返回,這需要至少乙個rtt時間,rtt時間波動很大從幾毫秒到幾秒。而且在沒有響應時,會等待數秒再次傳送,(詳見tcpv2第828頁),總共75秒到幾分鐘的connect超時時間。為了縮短超時時間,將非阻塞connect與select配合使用
二、connect的處理細節
1、當伺服器和客戶端在同乙個主機上時,connect會立刻建立;
2、建立成功select監測到描述符為可寫(詳見tcpv2第531頁);
3、建立失敗select檢測到描述符為可讀可寫(詳見tcpv2第530頁);
4、當可寫返回時,通過寫成功與否來判斷,網路建立成功或失敗。
三、**詳解
int myconnect(int fd, char *addr, int port, int timeout)
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(port);
//連線伺服器
ret = connect(fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
if( ret == 0 ) //連線成功,伺服器與客戶端立即建立連線
else
else //(errno==einprogress) //正在進行三次握手
else if(ret==0) //連線超時
else
else
}else}}
}//再次設定非阻塞讀寫
fcntl(fd, f_setfl, ioflags);
return 0;
}
Socket程式設計 非阻塞connect
閱讀skynet原始碼的過程中,發現一種非阻塞connect方式。以前不知道,這次好好學習一下。文章參考自 非阻塞connect編寫方法介紹 董的部落格 tcp連線的建立涉及到乙個三次握手的過程,鑑於rtt波動範圍很大,從區域網的幾個毫秒到幾百個毫秒甚至廣域網上的幾秒。這段時間內,我們可以執行其他處...
非阻塞方式connect程式設計
setsockopt 函式使用詳解 setsockopt so linger 選項設定 time wait狀態的作用 在學習linux下c網路程式設計時,標準的c s架構的網路體系模式時,沒有注意connect的非阻塞模式,最近看專案 時,發現原來connect非阻塞模式還有這麼大的作用。但從程式客...
非阻塞connect的實現
需要非阻塞connec的幾種情況 1.三路握手需要時間,這個要視具體的網路情況而定。當然也有可能失敗。在三路握手的時候我們並不需要在原地等待三路握手的完成,可以用這些時間來完成其它事情,然後當這些事情完成後,再去檢測連線是否建立 也就是三路握手是否完成 2.可以用這種技術來同時建立多個連線。web瀏...