【问题标题】:Python socket (Socket Error Bad File Descriptor)Python socket (Socket Error Bad File Descriptor)
【发布时间】:2013-05-05 08:50:46
【问题描述】:

以下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

【问题讨论】:

  • 错误可能不是来自该代码,而是无论您在哪里调用 self.server_socket.accept() - 都会有助于包含更多代码和完整的回溯。
  • 那么,您是希望服务器在收到文件后关闭,还是只想关闭活动连接?
  • @aya 在这段代码中我试图在收到文件后关闭服务器。

标签: python sockets


【解决方案1】:

您正在关闭服务器的侦听套接字,然后再次调用它的 accept()。 要完成接收一个文件,您应该关闭客户端连接的套接字(函数 receiveFile 中的 sock)。

【讨论】:

  • 我明白你的意思,关闭套接字和关闭服务器的正确顺序是什么
  • 这取决于您何时需要关闭服务器。如果您只想接收一个文件,只需关闭客户端连接,然后 - 监听套接字。
【解决方案2】:

在这段代码中,我试图在收到文件后关闭服务器

当您想要关闭服务器时,您需要打破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'

【讨论】:

  • 感谢@aya,我通过从 receiveFile 函数返回值来打破循环以不同的方式解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2016-06-05
  • 2018-04-22
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多