web-dev-qa-db-ja.com

Python socket(Socket Error Bad File Descriptor)

次のreceiveFile()関数は、ソケットからファイル名とファイルデータを読み取り、区切り文字_$_を使用して分割します。

しかし、ソケットを閉じることができず、_Bad file descriptor_エラーが発生します。 self.server_socket.close()ステートメントをコメント化すると、エラーは発生しませんが、ソケットは永久に待機します。

コード:-

_def listen(self):
    self.server_socket.listen(10)
    while True:
        client_socket, address = self.server_socket.accept()
        print 'connected to', address
        self.receiveFile(client_socket)



def receiveFile(self,sock):
    data = sock.recv(1024)
    data = data.split("$");
    print 'filename', data[0]
    f = open(data[0], "wb")
    #data = sock.recv(1024)
    print 'the data is', data[1]
    f.write(data[1])
    data = sock.recv(1024)
    while (data):
        f.write(data)
        data=sock.recv(1024)
    f.close()
    self.server_socket.close()
    print 'the data is', data
    print "File Downloaded"
_

トレースバック:-

_Traceback (most recent call last):
  File "server.py", line 45, in <module>
    a = Server(1111)
  File "server.py", line 15, in __init__
    self.listen()
  File "server.py", line 20, in listen
    client_socket, address = self.server_socket.accept()
  File "c:\Python27\lib\socket.py", line 202, in accept
    sock, addr = self._sock.accept()
  File "c:\Python27\lib\socket.py", line 170, in _dummy
    raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor
_
14
Ali Ahmad

サーバーのリスニングソケットを閉じ、その後、再びソケットに対してaccept()を呼び出します。 1つのファイルの受信を完了するには、クライアント接続ソケットを閉じます(sock in function receive File)。

8

このコードでは、ファイルを受信したらサーバーをシャットダウンしようとしています

必要なのは、サーバーをシャットダウンするときにwhile Trueループから抜け出すためのものです。簡単な解決策は、サーバーソケットを閉じるときに生成される例外を悪用することです...

def listen(self):
    self.server_socket.listen(10)
    while True:
        try:
            client_socket, address = self.server_socket.accept()
        except socket.error:
            break
        print 'connected to', address
        self.receiveFile(client_socket)
    print 'shutting down'
3
Aya