2013-05-05 20 views
12

次のreceiveFile()関数は、ソケットからファイル名とファイルデータを読み取り、デリミタ$を使用してそれを分割します。Pythonソケット(ソケットエラーBad File Descriptor)

しかし、ソケットを閉じることができず、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 
+1

エラーはそのコードから、おそらくありませんが、 'self.server_socket.acceptを()'呼んでいるところはどこでも - もう少し多くのコードと完全なトレースバックを含めるのに役立ちます。 – Aya

+0

これは、ファイルが受信された後にサーバーをシャットダウンするか、アクティブな接続を閉じるだけですか? – Aya

+0

このコードで@ayaファイルが受信されると、サーバーをシャットダウンしようとしています。 –

答えて

7

あなたは、サーバーのリスニングソケットをクローズし、それが再び呼び出した後、その上に()を受け入れています。 1つのファイルの受信を終了するには、クライアント接続のソケットを閉じる必要があります(関数receiveFileのsock)。私は、ファイルたら、サーバーをシャットダウンしようとしています。このコードで

+0

私はあなたのポイントを理解し、ソケットを閉じてサーバをシャットダウンする正しいシーケンスは何ですか –

+2

それはいつサーバをシャットダウンする必要があるかによって異なります。 1つのファイルだけを受信したい場合は、クライアント接続を閉じ、そのあとにリスニングソケットを閉じます。 –

3

を受信すると、あなたは必要なものは、サーバーをシャットダウンするとき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' 
+0

ありがとう@aya私は別の方法でループを中断するreceiveFile関数から値を返すことによって回避する –

関連する問題