留下點(diǎn)回憶
posted on 2011-12-05 10:18 笨笨 閱讀(2866) 評(píng)論(10) 編輯 收藏 引用 所屬分類: Network 、Linux
好悲慘的設(shè)計(jì)。 回復(fù) 更多評(píng)論
一般是發(fā)生錯(cuò)誤才需要檢查errno的吧,發(fā)生錯(cuò)誤了errno就被修改了,具體看man手冊(cè),為啥會(huì)要在errno沒有被改也即沒有發(fā)生錯(cuò)誤的情況下檢查errno呢? 回復(fù) 更多評(píng)論
@冷鋒舉個(gè)例子吧!TCP發(fā)送FIN包的時(shí)候會(huì)有時(shí)間IN事件過來,這個(gè)時(shí)候去Read,返回是0,也就是什么也沒有讀到。這種情況下是不會(huì)有錯(cuò)誤發(fā)生的,但怎么樣區(qū)分是連接關(guān)閉還是數(shù)據(jù)沒有呢,你就不得不使用errno了。。。說到這里我想你應(yīng)該明白了。。。 回復(fù) 更多評(píng)論
在reset errno之前還應(yīng)該為errno保存一個(gè)副本吧? 回復(fù) 更多評(píng)論
@Onway這個(gè)可能是要注意的,有的情況下,上一次的errno是需要被檢查的。 回復(fù) 更多評(píng)論
man recv顯示返回值是-1或者>=0的數(shù),只有=-1才是錯(cuò)誤發(fā)生,只有錯(cuò)誤發(fā)生了errno才會(huì)被修改才是有效的吧,你在=0的時(shí)候取errno去判斷是有問題的,對(duì)方發(fā)fin包過來,我方會(huì)收到可讀通知,然后recv就會(huì)收到0,就說明對(duì)方關(guān)閉連接了啊@笨笨 回復(fù) 更多評(píng)論
@冷鋒如果你循環(huán)接收數(shù)據(jù),知道一個(gè)錯(cuò)誤發(fā)生,因?yàn)槟愕腂UFFER有限,所以你最后一次read到的結(jié)果是0,這個(gè)時(shí)候errno不是為0.FIN的時(shí)候read結(jié)果是0,這個(gè)時(shí)候errno是0.不使用errno,請(qǐng)問還有什么好辦法? 回復(fù) 更多評(píng)論
文檔里面是這么寫的:the return value will be 0 when the peer has performed an orderly shutdown.難道還有其他情況recv會(huì)返回0的嗎?除非文檔有問題。如果你是用的阻塞式的socket,buffer有限,會(huì)一直被阻塞,如果是非阻塞的話,那么肯定會(huì)返回<0吧,然后檢查errno==EAGAIN,說明緩沖器已經(jīng)沒有東西可讀了@笨笨 回復(fù) 更多評(píng)論
我用的是read,另外文檔只是文檔。。。 回復(fù) 更多評(píng)論
這類破文章都能等上首頁,真是墮落。 回復(fù) 更多評(píng)論
Powered by: C++博客 Copyright © 笨笨