Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多个套接字连接时的recvfrom()行为_Python_Python 2.7_Sockets_Recvfrom - Fatal编程技术网

Python 多个套接字连接时的recvfrom()行为

Python 多个套接字连接时的recvfrom()行为,python,python-2.7,sockets,recvfrom,Python,Python 2.7,Sockets,Recvfrom,我一直在胡闹一个程序,它将数据包发送给自身的其他副本,而recvfrom的行为我并不完全理解。程序的每个实例都设置在不同的端口上(其他实例的端口号已存储在dictMap字典中)。我的想法是,在我启动了这个程序的多个实例(比如8个)之后,它们应该每秒相互ping 3次(最小更新间隔) 但是,如果我在一整组实例运行时关闭其中一个实例,程序都会多次打印“检测到丑陋的断开连接等”,即使断开连接的实例只断开了一次连接。这背后的原因是什么?我的部分代码如下: PORT = int(args.port) so

我一直在胡闹一个程序,它将数据包发送给自身的其他副本,而recvfrom的行为我并不完全理解。程序的每个实例都设置在不同的端口上(其他实例的端口号已存储在dictMap字典中)。我的想法是,在我启动了这个程序的多个实例(比如8个)之后,它们应该每秒相互ping 3次(最小更新间隔)

但是,如果我在一整组实例运行时关闭其中一个实例,程序都会多次打印“检测到丑陋的断开连接等”,即使断开连接的实例只断开了一次连接。这背后的原因是什么?我的部分代码如下:

PORT = int(args.port)
socket.setdefaulttimeout(1)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,0)#make udp socket and use it to connect
s.bind(("",PORT))
s.setblocking(False)


#timing considerations
STARTTIME = time.time()
prevsent = STARTTIME


print "Node started..."
while True:

    readable, writable, err = select.select([s],[s],[s]) #using select to poll our socket to see if it is readable

    for sock in writable:#if s is writable (it should be), there are packets in the send queue AND one of the next two conditions is met:
        if forwardQueue:
            msgArr = forwardQueue.pop(0)
            sock.sendto(msgArr[MSG],("127.0.0.1",int(msgArr[DESTPORT])))


    for sock in readable: #if there's something to be read...
        try:
            recvMsg, addr = sock.recvfrom(2048)
        except:
            print "ugly disconnect detected" + str(addr[1]) + recvMsg
            break



    for sock in err:
        print "ERROR"



    if time.time() - MINI_UPDATE_INTERVAL > prevsent: #once a second
        # print time.time() - STARTTIME

        for key,value in dictMap.iteritems():
            forwardQueue.append([('PING'+ '|'+idName+'|'+str(time.time())),value])

编辑:问题似乎只发生在windows上(断开连接后,WSAECONNRESET不断弹出)。由于我的代码最终将用于linux,我想这没什么大不了的。

我相信,每次尝试向主机上的某个端口发送数据包时,如果该端口上没有任何内容正在侦听(或者侦听积压已满),您都会遇到错误


我建议在异常处理程序中删除dictMap中的条目,以阻止抛出其他异常,因为您现在知道没有任何异常。

不确定udp套接字上的断开连接消息来自何处。没有连接,因此不能断开连接。也许你没有得到你认为的例外?你为什么不抓取异常并打印出它的详细信息呢?当我打印出异常时,我在实际代码中得到错误号10054(远程主机关闭的现有连接),我会从dictMap中删除断开连接的条目,但是异常会一直被抛出,即使有问题的端口不再发送任何内容。当另一端发生故障时,是否可能已经有多个发送在运行中?另外,您可能应该在循环中调用recvfrom,直到它返回一个EWOULDBLOCK。。。调用select的代价很高——现在,每次调用select都只能得到一个结果,即使有100个结果可用。这是非常可能的。有没有办法让我看看套接字缓冲区是否已满(或当前已满的程度)?另外,这是windows上的,不是吗?这好像是windows上的东西。这是windows上的。这是一个最终将在linux机器上演示的作业(明天我将前往uni进行测试),但我现在就给你提建议