如何在python中清空套接字?

luc*_*luc 10 python sockets select

我需要清空套接字上的数据(确保没有东西可以接收).不幸的是,在python套接字模块中没有这个功能.

我用这种方式实现了一些东西:

def empty_socket(sock):
    """remove the data present on the socket"""
    input = [sock]
    while 1:
        inputready, o, e = select.select(input,[],[], 0.0)
        if len(inputready)==0: break
        for s in inputready: s.recv(1)
Run Code Online (Sandbox Code Playgroud)

你怎么看?有没有更好的方法呢?


更新:我不想更改套接字超时.为什么我更喜欢选择阅读.


更新:最初的问题是使用"刷新"术语.似乎"空"是一个更好的术语.


更新 - 2010-02-27:我已经注意到该对关闭时的一个错误.inputready总是用套接字填充.我通过添加最大数量的循环来修复它.有更好的解决方案吗?

Tho*_*mas 6

如果通过"flush"意味着丢弃任何挂起的传入数据,那么您可以像使用select()一样使用select,或者将套接字设置为非阻塞并在循环中读取,直到您没有数据为止.

另请注意(来自Linux手册页):

在Linux下,select()可以将套接字文件描述符报告为"准备好读取",而不是后续的读取块.这可能例如在数据到达时发生但在检查时具有错误的校验和并被丢弃.可能存在其他情况,其中虚假地报告文件描述符为就绪.因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全.

选择系统调用的虚假就绪通知

正如其他人所指出的,"冲洗"通常指的是输出.

  • “刷新”输入的正确术语是什么?感谢您的回答 (2认同)

Vin*_*jip 5

使用select.select是一种很好的做法,如Socket Programming HOWTO 所示。您需要将套接字设置为非阻塞,使用sock.setblocking(0).

只是对命名法的评论:flush通常与输出操作相关联。