【问题标题】:Python Mutliprocessing/Sockets - Bad File DescriptorPython 多处理/套接字 - 错误的文件描述符
【发布时间】:2015-12-02 03:28:12
【问题描述】:

我正在用 Python 编写一个服务器,客户端将发送命令(通过命令行 arg)“BYE”。此时应终止客户端/服务器之间的连接。 (我认为 socket.close() 会终止连接,但我不完全确定这是否正确)

我编写了一个改编的回显服务器,其中 clientsocket.close() 位于服务器迭代的末尾。我希望只有在收到 BYE 时才会发生这种情况。

我不确定我的服务器程序的结构是否导致了问题(我还没有使用 getopt - 因为我仍然需要弄清楚)

服务器:

from multiprocessing import Process
import socket
import os

def handler(clientsocket, clientaddr):
    print "Accepted connection from: ", clientaddr
    while 1:
        data = clientsocket.recv(1024)
        if data:
            if data == "BYE":
                print "recvd BYE"
                clientsocket.send("BYE")
                clientsocket.close()
#                p.join()
            elif data == "DIR":
                print "recvd DIR"
                DIR = os.getcwd()
                clientsocket.send(DIR)

            print "data recieved:"
            print data
            msg = "You sent me: %s" % data
            clientsocket.send(msg)
            clientsocket.close()
            return

if __name__ == "__main__":

    TCP_IP = '127.0.0.1'
    TCP_PORT = 5004
    BUFFER_SIZE = 1024

    print 'socket()'
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    print 'bind()'
    s.bind((TCP_IP, TCP_PORT))

#    f = open('recv.txt', 'wb')

    print 'listen()'
    s.listen(5)

    workerProcesses =[]

    while 1:
        print "Server is listening for connections\n"
        clientsocket, clientaddr = s.accept()
        p = Process(target=handler, args = (clientsocket, clientaddr))
        p.start()
#        p.join()
        workerProcesses.append(p)

    serversocket.close()

当我将 clientsocket.close() 放入 if "BYE" 语句时,我收到错误:错误的套接字描述符。服务器的输出是:

data recieved:
BYE
Process Process-1:
Traceback (most recent call last):
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap
    self.run()
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "pyServ.py", line 26, in handler
    clientsocket.send(msg)
  File "/usr/lib64/python2.6/socket.py", line 167, in _dummy
    raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor

关于为什么会发生这种情况的任何想法?

【问题讨论】:

    标签: python sockets concurrency process concurrent-programming


    【解决方案1】:

    在你的 handler() 函数中你有这个:

           if data == "BYE":
                print "recvd BYE"
                clientsocket.send("BYE")
                clientsocket.close()
                #p.join()
            elif data == "DIR":
                print "recvd DIR"
                DIR = os.getcwd()
                clientsocket.send(DIR)
    
            print "data recieved:"
            print data
            msg = "You sent me: %s" % data
            clientsocket.send(msg)
            clientsocket.close()
            return
    

    如果data == "BYE" 然后你发送“BYE”并关闭你的套接字......然后你打印“收到的数据”(错字):)

    然后在if 语句中调用close()。一旦在if 语句之外,您尝试在刚刚关闭的那个套接字上再次send() 数据。一旦关闭套接字,文件句柄就不再有效。您需要修改代码,以免在关闭的套接字上发送...我看到有两种明显的方式。

    应该是

            if data == "BYE":
                print "recvd BYE"
                clientsocket.send("BYE")
                clientsocket.close()
                #p.join()
            elif data == "DIR":
                print "recvd DIR"
                DIR = os.getcwd()
                clientsocket.send(DIR)
    
            print "data recieved:"
            print data
            return
    

    if 语句中删除对 clientsocket.close() 的调用

    【讨论】:

    • 非常感谢,为了实现我的目标(在“BYE”上结束套接字),我省略了第二个 send() 和 close() 调用,就像在你的第一个示例中一样,它的工作原理与我希望。
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2012-11-12
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多