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