網路程式設計 非阻塞connect詳解

2021-08-02 12:01:18 字數 927 閱讀 4223

一、為什麼使用非阻塞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瀏...