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