新聞中心
socket超時(shí)什么意思?
你好,這分為兩種情況。Socket.connect連接超時(shí)有二種情況:

創(chuàng)新互聯(lián)是一家企業(yè)級(jí)云計(jì)算解決方案提供商,超15年IDC數(shù)據(jù)中心運(yùn)營(yíng)經(jīng)驗(yàn)。主營(yíng)GPU顯卡服務(wù)器,站群服務(wù)器,電信內(nèi)江機(jī)房,海外高防服務(wù)器,成都機(jī)柜租用,動(dòng)態(tài)撥號(hào)VPS,海外云手機(jī),海外云服務(wù)器,海外服務(wù)器租用托管等。
1.由于網(wǎng)絡(luò)的問(wèn)題,TCP/IP三次握手時(shí)間>timeout的設(shè)置時(shí)間。
這在國(guó)外訪(fǎng)問(wèn)weibo時(shí),并且網(wǎng)絡(luò)環(huán)境極差的情況下有可能發(fā)生。解決的辦法:調(diào)大socket.connect方法中的timeout參數(shù)值,比如50s,linux默認(rèn)最高是70s,如果超過(guò)70s沒(méi)有意義,linux會(huì)采用70s.但是當(dāng)調(diào)大之后,發(fā)現(xiàn)不到10s就報(bào)timeout exception。
通過(guò)國(guó)外的機(jī)器ping api.weibo.com發(fā)現(xiàn)unreachable。說(shuō)明客戶(hù)端在傳輸層之下的網(wǎng)絡(luò)層就發(fā)現(xiàn)連個(gè)Syn的報(bào)文都發(fā)不出去,更不用說(shuō)三次握手了,客戶(hù)端直接失敗并拋timeout exception。經(jīng)驗(yàn):在connection timeout診斷的第一步應(yīng)該是ping一下確認(rèn)網(wǎng)絡(luò)層沒(méi)有問(wèn)題。注:客戶(hù)端設(shè)置了timeout,但并不會(huì)等到超時(shí)才返回異常。客戶(hù)端只要第一時(shí)間發(fā)現(xiàn)連接失敗,就會(huì)拋timeout exception。
2.如果timeout設(shè)置的時(shí)間足夠,但是由于服務(wù)器端的處理能力較差,比如緩沖連接隊(duì)列較小,而應(yīng)用層的處理能力沒(méi)有連接緩沖快,導(dǎo)致緩沖連接占滿(mǎn),而拒絕新的連接。
在服務(wù)端因?yàn)檫B接隊(duì)列占滿(mǎn)而拒絕服務(wù)的期間,客戶(hù)端的通過(guò)TCP協(xié)議重試三次。每次的時(shí)間翻倍。
如果三次時(shí)間的累加
網(wǎng)絡(luò)編程中阻塞和非阻塞socket的區(qū)別?
阻塞:一般的I/O操作可以在新建的流中運(yùn)用.在服務(wù)器回應(yīng)前它等待客戶(hù)端發(fā)送一個(gè)空白的行.當(dāng)會(huì)話(huà)結(jié)束時(shí),服務(wù)器關(guān)閉流和客戶(hù)端socket.如果在隊(duì)列中沒(méi)有請(qǐng)示將會(huì)出現(xiàn)什么情況呢?那個(gè)方法將會(huì)等待一個(gè)的到來(lái).這個(gè)行為叫阻塞.accept()方法將會(huì)阻塞服務(wù)器線(xiàn)程直到一個(gè)呼叫到來(lái).當(dāng)5個(gè)連接處理完閉之后,服務(wù)器退出.任何的在隊(duì)列中的呼叫將會(huì)被取消.
非阻塞:非阻塞套接字是指執(zhí)行此套接字的網(wǎng)絡(luò)調(diào)用時(shí),不管是否執(zhí)行成功,都立即返回。比如調(diào)用recv()函數(shù)讀取網(wǎng)絡(luò)緩沖區(qū)中數(shù)據(jù),不管是否讀到數(shù)據(jù)都立即返回,而不會(huì)一直掛在此函數(shù)調(diào)用上。在實(shí)際Windows網(wǎng)絡(luò)通信軟件開(kāi)發(fā)中,異步非阻塞套接字是用的最多的。平常所說(shuō)的C/S(客戶(hù)端/服務(wù)器)結(jié)構(gòu)的軟件就是異步非阻塞模式的
為什么我的socket的read方法沒(méi)有阻塞,直接?
一、你調(diào)用read的時(shí)候,實(shí)際上調(diào)用的是socketchannel的read方法,而你設(shè)置的阻塞模式是ServerSocketChannel的模式,所以調(diào)用read時(shí)依然會(huì)采用默認(rèn)的阻塞方式,如果你希望用非阻塞的方式,只要設(shè)置一下socketchannel的阻塞模式就OK了。
二、默認(rèn)情況下,read的方法是阻塞模式的,所以沒(méi)有辦法設(shè)置他的超時(shí)時(shí)間,如果客戶(hù)端異常退出,當(dāng)前的連接將永遠(yuǎn)等待下去,如果你修改成非阻塞模式就沒(méi)有這個(gè)問(wèn)題了,非阻塞模式你可以判斷read返回值,如果超過(guò)N時(shí)間返回值一直都是0,就把當(dāng)前的連接關(guān)閉。
三、我并沒(méi)有這樣混合用過(guò),還沒(méi)遇到過(guò)這樣的問(wèn)題,我猜想有可能是跟關(guān)閉的socketchannel、socket等等有關(guān)吧,可能關(guān)閉socket和關(guān)閉channel有些區(qū)別,我也不確定,反正建議你,想要NIO就用NIO,要是想要serversocket和scoket,那就只用這兩個(gè),盡量不要混合使用。希望對(duì)你有幫助。
到此,以上就是小編對(duì)于socketaccept阻塞的問(wèn)題就介紹到這了,希望這3點(diǎn)解答對(duì)大家有用。
本文標(biāo)題:socket超時(shí)什么意思?windowssocket阻塞
網(wǎng)站網(wǎng)址:http://fisionsoft.com.cn/article/coisicj.html


咨詢(xún)
建站咨詢(xún)
