非阻塞connect的實現

2021-07-11 04:17:58 字數 1005 閱讀 7779

需要非阻塞connec的幾種情況:

1.三路握手需要時間,這個要視具體的網路情況而定。當然也有可能失敗。在三路握手的時候我們並不需要在原地等待三路握手的完成,可以用這些時間來完成其它事情,然後當這些事情完成後,再去檢測連線是否建立(也就是三路握手是否完成)。

2.可以用這種技術來同時建立多個連線。(web瀏覽器中很常用)。

3.connect超時需要很長時間才會通知,如果我們認為超過0.1秒以後就算超時(不管它是不是真的超時),這是就可以使用非阻塞式i/o結合 select來完成。

// 設定套接字非阻塞!

int setnonblocking(int fd)

int connectnonblocking(int fd, const sockaddr *addr, socklen_t addrlen, int nsec)

}// errno == einprogress的情況繼續往下執行

if(ret == 0)

fd_set rset,wset;

fd_zero(&rset);

fd_set(fd,&rset);

wset =rset;

timeval time_out;

time_out.tv_sec = nsec;

time_out.tv_usec = 0;

// 超時時間設定

timeval* ptime_out = 0;

if(nsec > 0)

if((ret = select(fd+1,&rset,&wset,0,ptime_out)) == 0)

// 判斷連線是否成功

if(fd_isset(fd,&rset) || fd_isset(fd,&wset))

if(err)

}else

// 連線成功!

fcntl(fd,f_setfl,oldflag);

return 0;

}

非阻塞 connect套接字

非阻塞connect套接字的作用 1 完成乙個connect要花費rtt時間,而rtt波動範圍很大,從區域網上的幾個毫秒甚至是廣域網上的幾秒,這段時間也許有我們要執行的其他處理工作可以執行。2 可以使用這個技術同事建立多個連線。3 許多connect的超時實現以75秒為預設值,如果應用程式想自定義乙...

socket使用非阻塞connect

在使用tcp的connect呼叫時,預設是使用阻塞方式,當伺服器當前不可用時,connect會等待 內部在重試?直到超時時間到達,而這個超時時間是系統核心規定的,不能使用setsocketopt來設定。在碰到伺服器不可用,上層邏輯進行重試時,如果超時時間過長,會產生卡死的感覺,使用者體驗也不佳,所以...

Socket程式設計 非阻塞connect

閱讀skynet原始碼的過程中,發現一種非阻塞connect方式。以前不知道,這次好好學習一下。文章參考自 非阻塞connect編寫方法介紹 董的部落格 tcp連線的建立涉及到乙個三次握手的過程,鑑於rtt波動範圍很大,從區域網的幾個毫秒到幾百個毫秒甚至廣域網上的幾秒。這段時間內,我們可以執行其他處...