Python UDP recvfrom()特定地址

Python UDP recvfrom()特定地址,python,networking,udp,recv,Python,Networking,Udp,Recv,我看到的这段代码的问题是,尽管它正在工作,但发送到此服务器的一些信息客户端(玩家)在打算结束于“clientRequests”时将结束于方法“permission”,因为它们都有recvfrom()。因此,如果我可以指定要从哪个addr获取信息作为recvfrom()的参数,它就会解决这个问题。我相信C++是可能的,但是它是用Python的吗? 对于TCP,这个问题不存在,但我更喜欢UDP 类似于:recvfrom(512,地址=(ip,端口)) “权限”用于处理新客户端连接 问题在于,位置、客

我看到的这段代码的问题是,尽管它正在工作,但发送到此服务器的一些信息客户端(玩家)在打算结束于“clientRequests”时将结束于方法“permission”,因为它们都有recvfrom()。因此,如果我可以指定要从哪个addr获取信息作为recvfrom()的参数,它就会解决这个问题。我相信C++是可能的,但是它是用Python的吗? 对于TCP,这个问题不存在,但我更喜欢UDP

类似于:recvfrom(512,地址=(ip,端口))

“权限”用于处理新客户端连接

问题在于,位置、客户发送的事件等信息不会在“许可”下得到处理

class Server:
    def __init__(self):
        #host = '192.168.0.2'
        host = '127.0.0.1'
        port = 50007
        addr = (host, port)
        self.UDPSock = socket(AF_INET, SOCK_DGRAM)
        self.UDPSock.bind(addr)
        self.UDPSock.settimeout(5.0)
        self.searchForClients = True
        self.playersOnline = []
        threading.Thread(target=self.permission).start()
        Gui.add_event("Server online on port %s" % port)


    def permission(self):
        global _status
        while self.searchForClients:
            time.sleep(0.5)
            _status.set("Status: Running; Connected: %s" % len(self.playersOnline))
            try:
                clientMessage, addr = self.UDPSock.recvfrom(1024) # , MSG_PEEK
            except:
                clientMessage = ""
            if clientMessage == "CONNECT" and addr not in self.playersOnline:                       
                if self.searchForClients:
                    self.addNewClient(addr)

            elif clientMessage == "DISCONNECT" and addr in self.playersOnline:
                self.removeClient(addr)

        Gui.add_event("No longer accepting logins")
        return False

    def clientRequests(self, addr):
        latestRequest = time.time()
        while addr in self.playersOnline:
            time.sleep(0.01)
            try:
                data, requestAddr = self.UDPSock.recvfrom(1024)
            except:
                requestAddr, data = "", ""
            if requestAddr == addr:
                latestRequest = time.time()
                dataCommand = data.split(':')
            if time.time() - latestRequest > 2:
                if addr in self.playersOnline:
                    self.removeClient(addr)

        if not self.searchForClients:       
            Gui.add_event("Player %s(%s) forcibly removed" % addr)
        return False

我认为线程不必要地使像这样的简单UDP服务器复杂化。只需监听套接字,并根据是否已经看到数据包的源地址来调度调用


不,常规的系统调用不允许您“过滤”从哪个地址获取数据,而只是为了获取那个信息。过滤是在UDP套接字上完成的,但这限制了每个套接字只有一个源。

我认为线程不必要地使像这样的简单UDP服务器复杂化。只需监听套接字,并根据是否已经看到数据包的源地址来调度调用


不,常规的系统调用不允许您“过滤”从哪个地址获取数据,而只是为了获取那个信息。过滤是在UDP套接字上完成的,但这限制了每个套接字只能有一个源。

这实际上是我和朋友一起玩的一个在线游戏项目,每个客户端有一个线程很重要,一个线程只能监听该地址:(PS)我在这里展示的显然不是整个服务器类编辑:我将查找connect(2)谢谢。这只是一个建议——试着用状态机来思考游戏。你可能会发现你关于必须有线程的假设是错误的。实际上,这是我和朋友们正在进行的一个在线游戏项目,每个客户端有一个线程很重要,一个线程只监听该地址:(PS)我在这里展示的显然不是整个服务器类的编辑:我将查找connect(2)谢谢..只是一个建议-试着从状态机的角度考虑游戏。你可能会发现你关于必须有线程的假设是错误的。