web-dev-qa-db-fra.com

Python socket (Socket Error Descripteur de fichier incorrect)

La fonction receiveFile() suivante lit un nom de fichier et des données de fichier à partir du socket et les divise à l'aide du délimiteur $.

Mais je ne parviens pas à fermer le socket et une erreur Bad file descriptor Est générée. Si je commente l'instruction self.server_socket.close() alors il n'y a pas d'erreur mais le socket écoute pour toujours.

Code:-

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: -

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

Vous fermez le socket d'écoute du serveur et après cela, appelez à nouveau accept (). Pour terminer la réception d'un fichier, vous devez fermer le socket de connexion client (enfoncez dans la fonction receiveFile).

8

dans ce code, j'essaie d'arrêter le serveur une fois le fichier reçu

Vous aurez besoin de quelque chose pour sortir du while True boucle lorsque vous souhaitez arrêter le serveur. Une solution simple serait d'exploiter l'exception générée lors de la fermeture du socket serveur ...

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