日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux网络编程-----非阻塞connect

發(fā)布時(shí)間:2024/4/19 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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é)果存入error中 */ getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len);

總結(jié)

以上是生活随笔為你收集整理的linux网络编程-----非阻塞connect的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。