gpt4 book ai didi

c - 套接字错误是否意味着套接字已关闭

转载 作者:太空狗 更新时间:2023-10-29 11:45:46 25 4
gpt4 key购买 nike

我正在编写一个客户端-服务器程序。服务器正在select()ing readfd1 等待读取readfd1。如果准备就绪,服务器正在收集数据并打印。一段时间内一切正常,但一段时间后,套接字 recv() 失败,errno 设置为 ETIMEDOUT。现在我想重写我的程序来阻止这些错误条件。所以我看了 Richard Stevens 的“Unix Network Programming”,其中规定了 select() 解锁的 4 个条件。以下是引起我注意的 2 个条件

A. client sent FIN, here return value of `recv()` will be `0`
B. some socket error, here return value of `recv()` will be `-1`.

我的问题是,套接字错误会关闭连接吗?如果是这样,那么为什么以上两个条件是分开的。如果没有,套接字上的下一个 recv() 是否有效?

最佳答案

如果recv()返回0,说明另一端已经主动优雅的关闭了连接。

如果 recv() 返回 -1,则(可能)连接出现错误,无法再使用。

这意味着您可以区分对等方关闭连接和连接发生错误。在这两种情况下,通常要做的是 close() 套接字的末端。

还有两点需要考虑:

recv() 返回 -1 的情况下,您应该检查 errno,因为它可能并不表示真正的错误。errno 可以是 EAGAIN/EWOULDBLOCK 如果您将套接字置于非阻塞模式,或者它可以是 EINTR 如果系统调用被中断一个信号。所有其他 errno 值表示连接已断开,您应该关闭它。

TCP 可以半双工运行。如果对等方仅关闭了连接的写入端,则 recv() 在您的端返回 0。常见的做法是认为连接已完成,也关闭连接的一端,但您可以继续写入,另一端可以继续从中读取。是否仅关闭 TCP 连接的读取端或写入端由 shutdown() 函数控制。

关于c - 套接字错误是否意味着套接字已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16814552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com