linux网络编程-----非阻塞connect
生活随笔
收集整理的這篇文章主要介紹了
linux网络编程-----非阻塞connect
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
libevent在內(nèi)部由于使用io多路復(fù)用函數(shù)進(jìn)行的事件監(jiān)控,所以它所有的io讀寫操作都是非阻塞的,換句話說,libevent提供的接口函數(shù)evconnlistener_new_bind()和bufferevent_socket_connect()在內(nèi)部使用socket創(chuàng)建套接字,會(huì)默認(rèn)將其變?yōu)榉亲枞?#xff08;使用fcntl可以實(shí)現(xiàn))。
比較特殊的就是客戶端的connect函數(shù),因?yàn)樘捉幼肿優(yōu)榉亲枞?#xff0c;所以connect會(huì)立即返回,這就可能出現(xiàn)以下三種情況
- 連接立即建立,返回0
- 正在進(jìn)行三路握手,返回-1,errno設(shè)置為EINPROGRESS
- 連接失敗,返回-1,errno不為EINPROGRESS
非阻塞的connect可以節(jié)省三路握手的時(shí)間,可以運(yùn)行其它的任務(wù),不需要等待三路握手完成。
所以判斷什么時(shí)候連接建立完成是很重要的,判斷的依據(jù)是套接字的可讀/可寫狀態(tài)
- 當(dāng)連接成功建立時(shí),描述符變?yōu)榭蓪?/li>
- 當(dāng)連接建立遇到錯(cuò)誤時(shí),描述符變?yōu)榧瓤勺x又可寫
這兩個(gè)規(guī)則很好理解,
- 當(dāng)連接成功建立,tcp的緩沖區(qū)為空,客戶端就可以使用send/write等io函數(shù)向套接字描述符寫入數(shù)據(jù),就是說描述符變?yōu)榭蓪?/li>
- 當(dāng)連接建立失敗,tcp的緩沖區(qū)仍然可寫,但是因?yàn)槌霈F(xiàn)錯(cuò)誤,所以緩沖區(qū)中存在著連接錯(cuò)誤信息,所以既可讀又可寫
有以下幾種方法可以達(dá)到對connect連接的判斷
- 使用select對客戶端套接字進(jìn)行監(jiān)聽,同時(shí)設(shè)置超時(shí)時(shí)長。這種方法主要用于減少connect默認(rèn)的超時(shí)時(shí)長,當(dāng)select返回后,可以判斷套接字描述符是否處在讀/寫事件集中。
- 既然libevent是統(tǒng)一事件源,所以連接的建立也是一個(gè)事件,將套接字描述符添加到event監(jiān)控中,當(dāng)可讀/可寫時(shí)就可以判斷連接情況
- 上述兩種方法都可以在io多路復(fù)用函數(shù)返回后通過getsockopt獲取套接字SO_ERROR選項(xiàng),當(dāng)結(jié)果為0時(shí)表示連接建立,否則失敗
總結(jié)
以上是生活随笔為你收集整理的linux网络编程-----非阻塞connect的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux网络编程-----TCP连接及
- 下一篇: linux 其他常用命令