Sockets 根据select(),处于错误状态的套接字是否准备好读取?

Sockets 根据select(),处于错误状态的套接字是否准备好读取?,sockets,network-programming,portability,Sockets,Network Programming,Portability,(我使用的是cpythonv2.6(在Linux、Windows和OSX上),但我认为我的问题不是针对Python或我的目标系统的。) 如果我的应用程序在select([sock],[],None)调用中被阻止,并且远程端被突然终止,那么即使我没有选择错误,我是否可以依赖select调用取消阻止 我知道做这些事情的正确方法是也检查套接字中的错误(例如,select([sock],[sock],None)),但我阅读的文档说,错误的定义因系统而异。我不确定其中有多少可能是“依赖于实现的”由于sel

(我使用的是cpythonv2.6(在Linux、Windows和OSX上),但我认为我的问题不是针对Python或我的目标系统的。)

如果我的应用程序在
select([sock],[],None)
调用中被阻止,并且远程端被突然终止,那么即使我没有选择错误,我是否可以依赖select调用取消阻止


我知道做这些事情的正确方法是也检查套接字中的错误(例如,
select([sock],[sock],None)
),但我阅读的文档说,错误的定义因系统而异。

我不确定其中有多少可能是“依赖于实现的”由于select()的这个区域有点模糊,这取决于您读取手册页的方式,但是我所使用的系统将以可读的方式返回套接字,然后您的读取将返回一个错误(这当然假设TCP,并且远程端重新设置了连接)。关键部分是“如果可以在不阻塞的情况下执行相应的I/O操作(例如,读取(2)),则认为描述符已准备就绪。“如果读取立即返回错误,则该语句将为true语句。我建议通过编写一个简单的客户机服务器,让客户机连接,然后选择读取,在目标系统上验证此行为。让服务器接受、休眠一秒钟,然后退出自身。如果我通常看到的对您来说是标准的,那么select将返回,套接字是可读的,并且您的读取不会阻塞,但将返回连接重置错误

哦,是的,只是为了让事情变得更糟(从)

在Linux下,select()可能会将套接字文件描述符报告为“ready for reading”(准备读取),但随后的读取会阻塞。例如,当数据已到达但检查时校验和错误并被丢弃时,可能会发生这种情况。在其他情况下,可能会错误地将文件描述符报告为就绪。因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全


第三组实际上并不适用于错误,尽管有时也被称为错误。它适用于特殊情况,例如TCP紧急数据。如果存在读取错误/远程断开连接,该错误/远程断开连接将显示在可读集中。