2

私は自分自身の他のコピーにパケットを送信するプログラムをいじっていましたが、recvfrom は完全には理解できない方法で動作していました。プログラムの各インスタンスは、異なるポートに設定されます (他のインスタンスのポート番号は dictMap ディクショナリに既に格納されています)。このプログラムのいくつかのインスタンス (たとえば 8 つ) を起動した後、すべてのインスタンスが 1 秒間に 3 回 (MINI_UPDATE_INTERVAL) 互いに ping を実行する必要があるという考えです。

ただし、インスタンス全体の実行中にインスタンスの 1 つを閉じると、プログラムはすべて「醜い切断が検出されたなど」と出力し続けます。切断されたインスタンスが 1 回しか切断されていない場合でも、複数回。この背後にある理由は何ですか? 私のコードの一部は以下のとおりです。

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 を対象としているので、大したことではないと思います。

4

1 に答える 1