新聞中心
socket阻塞解決辦法?
現(xiàn)在就可以得出解決方案了:使用select函數(shù)來(lái)監(jiān)視要清空的socket描述符,并把超時(shí)時(shí)間設(shè)置為0,每次讀取一個(gè)字節(jié)然后丟棄(或者按照業(yè)務(wù)需要進(jìn)行處理,隨你便了),一旦select返回0,說(shuō)明緩沖區(qū)沒(méi)數(shù)據(jù)了(“超時(shí)”了)

10年積累的成都做網(wǎng)站、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有河源免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
VC中使用API編寫(xiě)的socket程序中如何設(shè)置阻塞和非阻塞accept?
阻塞就是說(shuō) accept() 執(zhí)行時(shí)會(huì)一直停留在此調(diào)用中,直到返回正確的 connfd 前,不會(huì)執(zhí)行 accept() 之后的代碼。
非阻塞就是說(shuō) accept() 執(zhí)行時(shí)會(huì)立即返回結(jié)果,成功就返回正確的 connfd ,失敗就返回相應(yīng)錯(cuò)誤碼。 相應(yīng)的代碼就要不停的 accept() ,并處理成功和失敗的情況,但是因?yàn)?accept() 能快速返回結(jié)果,程序就很好的立即這個(gè)間隙,做此其他更有意義的事件。
上面描述的過(guò)程并不完全準(zhǔn)確,具體原理建議閱讀
UNIX網(wǎng)絡(luò)編程 (豆瓣)
如何解決socket阻塞?
由于socket是以數(shù)據(jù)流的形式發(fā)送數(shù)據(jù),接收方不知道對(duì)方一次性發(fā)送了多少數(shù)據(jù),也能保證對(duì)方一次性發(fā)送的數(shù)據(jù)能在同一刻接收到,所以Receive方法是這么工作的:
接受一個(gè)byye[]類(lèi)型的參數(shù)作為緩沖區(qū),在經(jīng)過(guò)一定的時(shí)間后把接收到的數(shù)據(jù)填充到這個(gè)緩沖區(qū)里面,并且返回實(shí)際接收到數(shù)據(jù)的長(zhǎng)度,這個(gè)實(shí)際接收到的數(shù)據(jù)長(zhǎng)度有可能為0(沒(méi)有接收到數(shù)據(jù))、大于0小于緩沖區(qū)的長(zhǎng)度(接收到數(shù)據(jù),但是沒(méi)有我們預(yù)期的多)、等于緩沖區(qū)的長(zhǎng)度(說(shuō)明接收到的數(shù)據(jù)大于等于我們預(yù)期的長(zhǎng)度)。
每次接收緩沖區(qū)都用同一個(gè)byte[]byteMessage,并且你沒(méi)有檢查接收到的數(shù)據(jù)長(zhǎng)度,所以第一次你接收到的數(shù)據(jù)是123456,第二次你只接收到了8,但是緩沖區(qū)里面還有23456,所以加起來(lái)就是823456了。
socket接收緩沖區(qū)的大小有講究,設(shè)置大了接收起來(lái)慢,因?yàn)樗缺M可能多的數(shù)據(jù)接收到了再返回;設(shè)置小了需要重復(fù)多次調(diào)用接收方法才能把數(shù)據(jù)接收完,socket有個(gè)屬性,標(biāo)識(shí)了系統(tǒng)默認(rèn)的接收緩沖區(qū)大小,可以參考這個(gè)!
還有就是用recv讀取,但是由于不知道緩存里有多少數(shù)據(jù),如果是阻塞模式,到最后必然等到超時(shí)才知道數(shù)據(jù)已經(jīng)讀取完畢,這是個(gè)問(wèn)題。
另一個(gè)是用fgetc,通過(guò)返回判斷是否是feof:
whlie(1){a=fgetc(f);if(feof(f))break;//…
b=fgetc(f);if(feof(f))break;//… } 當(dāng)然,我不知道讀取完畢后最后一次調(diào)用fgetc會(huì)不會(huì)堵塞,需要測(cè)試。
socket超時(shí)什么意思?
socket.setSoTimeout(inttimeout);恩。應(yīng)該能實(shí)現(xiàn)你的要求首先socket不是一個(gè)阻塞方法,它不會(huì)自動(dòng)去連serverSocket,而是你connect一次它就去連一次,socket本身不存在什么連接server端超時(shí),所以客戶(hù)端的連接超時(shí)是由你的程序去控制的,比如用線程。其次,惡意連接這個(gè)問(wèn)題,其實(shí)我已經(jīng)給你解決了,在server端拿到socket后,不就能用socket.setSoTimeout()來(lái)設(shè)置連接時(shí)間了么?
到此,以上就是小編對(duì)于windows設(shè)置socket非阻塞的問(wèn)題就介紹到這了,希望這4點(diǎn)解答對(duì)大家有用。
網(wǎng)頁(yè)標(biāo)題:socket阻塞解決辦法?windowssocket非阻塞
轉(zhuǎn)載來(lái)源:http://www.dlmjj.cn/article/dpgdoph.html


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