非套接字上的套接字操作

Posted

技术标签:

【中文标题】非套接字上的套接字操作【英文标题】:Socket operation on nonsocket 【发布时间】:2012-04-11 14:48:12 【问题描述】:

我有以下课程:

from socket import *
import select

class UdpListenerPort:
    def __init__(self, socket):
        self.socket = socket
        self.socket.setblocking(0)

    def get_data_to_dispatch(self):
        is_ready = select.select([self.socket],[],[],0.01)
        if is_ready[0]:
            return self.socket.recvfrom(0xffff)[0]
        else:
            return None

从线程内运行。当我退出线程时,出现以下异常:

return self.socket.recvfrom(0xffff)[0]
socket.error: [Errno 10038] An operation was attempted on something that is not a socket

我怎样才能避免这种情况,

谢谢,

巴里

【问题讨论】:

您是否在套接字上调用了bind? IIRC,如果您在未绑定的 UDP 套接字上调用 recvfrom,WinSock 将返回该特定错误。 您能否设计一个独立的小型示例来演示这一点,或者至少包含完整的堆栈跟踪? 是的,我在为上面的类调用 init 之前绑定。但是,get_data_to_dispatch() 是从不同的线程调用的。我猜问题是当我尝试在 is_ready = select.select([self.socket],[],[],0.01) 或 return self.socket.recvfrom(0xffff )[0]. 【参考方案1】:

我发现了问题。我将线程实现为上下文管理器。在退出方法中,我有以下内容:

def __exit__(self, type, value, traceback):
    try:
        self.is_alive = False
        while not self.is_finished:
            time.sleep(0.1)
    except:
        self.is_finished = True

以便优雅地退出线程。但是,我忘记输入时间了... :)

【讨论】:

以上是关于非套接字上的套接字操作的主要内容,如果未能解决你的问题,请参考以下文章

由于奇怪的语法,“非套接字上的套接字操作”错误

mysqli::real_connect(): (HY000/2002): 非套接字上的套接字操作

虽然没有来自客户端的连接操作,但服务器尝试接受连接并因“非套接字上的套接字操作”而失败

阻塞和非阻塞同步和异步

检测非阻塞套接字上的关闭连接

了解非阻塞套接字上的 EWOULDBLOCK