如果套接字超时设置小值,它是否具有任何缺点或错误



当我使用Python进行插座编程时,
我注意到某些操作并没有被中断。例如:accept()recv()
因此,我使用少量超时解决了这个问题,每1秒钟,程序就会停止操作并回想一下。例如,

socket.settimeout(1)    
while True:
    try:
        socket.recv()
    except timeout:
        # back to socket.recv()
        continue
    except KeyboardInterrupt:
        break

是否存在一些潜在的问题,例如在超时异常期间丢失一些消息,或者对操作系统进行重负载,等等?

,您是否有更好的主意可以停止插座不使用超时?请告诉我,我感谢您的回答。

还有另外一件事需要考虑。我在Windows中测试了此程序,即使我按 ctrl ctrl c ,键盘间断也实际上升起。但是在MacOS或Linux中,按下 ctrl c 之后,键盘间断就会增加。Windows和Linux/Unix之间是否存在差异?

带有插座,丢失数据的风险取决于套接字类型。

使用SOCK_DGRAM插座,没有保证该协议是可靠的。这意味着通常,无论您如何编程recv()调用,您都应该期望某些消息会丢失。

使用SOCK_STREAM,有一个保证传入的数据流将是可靠的,并且以相同的顺序发送。

如果您调用socket.settimeout(0)socket.setblocking(False),则recv()将检查插座的接收缓冲区以输入数据,如果没有,则会失败,其错误取决于操作系统。这可以定期用于数据,同时还可以使用其他事情。但是,它还可以将特定于操作系统的行为引入您的程序。

另一种常见技术是创建一个线程,其唯一目的是发送和接收设置为阻止模式的套接字[socket.setblocking(True)]。在这种情况下,线程可以调用recv()并尽可能长时间等待直到数据真正进入。此设置使您可以将协议编程为send()recv()调用之间的对话。

对于一次处理多个插座消息的应用程序,select()可以用来找出集合中的哪些插座对recv()的待处理数据。一个警告是,在需要高性能的情况下,select()效率低下。

相关内容

最新更新