读取Socket返回值技术咨询——UNP学习实践代码疑问
嘿,刚啃完UNP 5.1到5.3章节就动手写测试代码,这学习劲头必须给你点个赞!我来给你唠唠socket场景下read函数的返回值那些事儿,都是结合UNP里的知识点和实际编码经验来的:
Socket场景下read函数的返回值全解析
1. 返回值大于0
- 这说明成功读取到了
n个字节的数据,但要注意这个n不一定等于你请求读取的字节数!哪怕socket接收缓冲区里有数据,也可能因为TCP的分段机制、或者操作系统的接收策略,只返回部分数据。比如你调用read(sockfd, buf, MAXLINE),可能只读到几百字节,这时候就得循环读取,直到拿到你需要的全部数据(或者根据业务逻辑停止)。 - 你代码里的
str_echo函数用循环处理,就是UNP里典型的应对这种部分读取的思路,非常靠谱。
2. 返回值等于0
- 这代表对端已经主动关闭了TCP连接(收到了FIN包),此时这个socket已经没有任何数据可以读取了,你接下来要做的就是关闭这个socket描述符,清理相关资源,别占着资源浪费啦~
3. 返回值小于0(出错情况)
这时候得盯着errno的值来区分处理:
- EINTR:read调用被信号打断了,这不是真的错误!你可以像代码里的
again:标签那样,重新调用read就行,UNP里很多示例都是这么处理的。 - EAGAIN/EWOULDBLOCK:如果你的socket是非阻塞模式,这个错误表示当前socket缓冲区里没数据可读,你可以稍后再尝试读取,或者结合select/poll/epoll这些IO多路复用工具来处理,避免空等浪费资源。
- 其他错误(比如EBADF、ECONNRESET):这些就是实打实的错误了。比如EBADF是传了无效的文件描述符,ECONNRESET是对端直接重置了连接(比如突然崩溃),这时候就得根据具体错误码做对应处理——比如关闭socket、打印错误日志之类的。
内容的提问来源于stack exchange,提问作者jl0x61
相关产品推荐
相关产品推荐

