Python UDP recvfrom()具体地址

标签 python networking udp recv

我在这段代码中看到的问题是,尽管它正在工作,但客户端(玩家)发送到该服务器的一些信息最终将在“permission”方法中结束,而当打算以“clientRequests”结束时,因为两者其中有recvfrom()。因此,如果我可以指定我想要来自哪个地址作为recvfrom()的参数,它就可以解决这个问题。我相信用 C++ 是可能的,但是用 python 可以吗?如何实现? 对于 TCP,这个问题不存在,但我更喜欢 UDP。

类似于:recvfrom(512, address=(ip, port)) ?

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

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

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 服务器变得复杂。只需监听套接字并根据数据包的源地址是否已被看到来调度调用。

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

关于Python UDP recvfrom()具体地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8913109/

相关文章:

android - 如何首先将数据包从一部安卓手机发送到wifi路由器,然后再从路由器发送到另一部安卓手机??

c++ - Gstreamer 源代码不起作用

python - 为什么我的 Ubuntu 在启动 python 脚本后卡住?

c++ - 游戏引擎设计 : Multiplayer and listen servers

android - 通过 UDP 套接字发送字符串

networking - Go package syscall conn.Read() 是非阻塞的,导致 CPU 使用率高

c - 发送到() : Transport endpoint is not connected error while trying to send a response from server using UDP

python - 修饰 Python3 函数以忽略 (a, b, *args, **kwargs) 中的 *args?

python - 如何从大文件中读取行分隔的 JSON(逐行)

python - 如何在 Keras 中实现具有多个输出的自定义层?