【问题标题】:bad file descriptor python socket错误的文件描述符python套接字
【发布时间】:2019-01-28 09:34:43
【问题描述】:

我试图创建一个只接受数据而不接收回客户端的 udp 服务器,我遇到了这个问题,我不知道是什么导致了这个错误的文件描述符,这里是服务器代码:

import threading
import socket
import logging

class Broker():

    def __init__(self):
        logging.info('Initializing Broker')
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.bind(('', 6668))
        self.clients_list = []

    def talkToClient(self, ip):
        #logging.info("Sending 'ok' to %s", ip)

        print ("Buat Thread Baru")

        while True:
            try:
                data = self.sock.recv(1024)
                if data:
                    # Set the response to echo back the recieved data 
                    response = data
                    self.sock.send(response)
                else:
                    raise error('Client disconnected')
            except:
                self.sock.close()
                return False


            self.sock.sendto("ok", ip)


    def listen_clients(self):
        while True:
            msg, client = self.sock.recvfrom(1024)
            self.sock.settimeout(20)
            logging.info('Received data from client %s: %s', client, msg)
            t = threading.Thread(target=self.talkToClient, args=(client,))
            t.start()

if __name__ == '__main__':
    # Make sure all log messages show up
    logging.getLogger().setLevel(logging.DEBUG)

    b = Broker()
    b.listen_clients()

【问题讨论】:

    标签: python multithreading sockets server


    【解决方案1】:

    UDP 是无连接的,因此在您的线程代码中永远不可能出现错误Client disconnected。但是对于任何其他错误(在您的情况下可能是socket.timeout),套接字已关闭。随后,在您的主程序中出现bad filedescriptor 错误。

    如果你想在线程中超时,你需要打开一个新的套接字。此外,您必须向客户端发送一个问候消息,以便他知道用于一对一通信的新端口。

    另请注意:UDP 不可靠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      相关资源
      最近更新 更多