留下点回忆
posted on 2011-12-05 10:18 笨笨 阅读(2838) 评论(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 © 笨笨