3

私はPythonでサーバーを実装しています。DougHellmannのブログのチュートリアルに従っています:

select()壊れたパイプや閉じたパイプを捕まえられないという問題があります。

    # Create socket 
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # Non blocking socket
    serversocket.setblocking(0)
    # Bind socket
    serversocket.bind((HOST, PORT))
    # Socket listening
    serversocket.listen(5)

    # Sockets from which we expect to read
    inputs = [ serversocket ]
    # Sockets to which we expect to write
    outputs = [ ]

    resign = re.compile("resign")

    while inputs:
        print "Waiting for connection..."
        readable, writable, exceptional = select.select(inputs, outputs, inputs)

        for s in exceptional:
            print >>sys.stderr, 'handling exceptional condition for', s.getpeername()
            # Stop listening for input on the connection
            inputs.remove(s)
            s.close()


        for s in readable:
            # SERVER LISTENS TO CONNEXION
            if s is serversocket:

                if some_stuff_is_true:
                    connection, client_address = s.accept();
                    print 'New connection from ', client_address
                    connection.setblocking(0)
                    inputs.append(connection)


            # CLIENT READABLE
            else:
                data = s.recv(MAXLINE)
                #If socket has data to be read
                if data:
                    print data # Test if data correclty received
                    if resign.findall(data):
                        inputs.remove(s)
                        s.close()

クライアントがソケットを正常に閉じるとき、それはselectによってキャッチされず、クライアントがソケットを壊すとき、それは`例外によってキャッチされません。

このサーバーを閉じた/壊れたソケットに対して堅牢にする方法は?

4

1 に答える 1

3

ソケットがリモートエンドによってきれいに閉じられると、ソケットは「読み取り可能」になります。を呼び出すとrecv()ゼロバイトが返されます。else:あなたのコードはの節では何もしませんif data:。これは、閉じたソケットに反応するコードを配置する必要がある場所です。

于 2012-11-06T18:30:33.550 に答える