0

我正在尝试在单个客户端和服务器之间实现可靠的 UDP 消息传递方案。

在我当前的代码中,如果他只使用接收命令,我可以将递增数字 1 发送到服务器。如果服务器尝试使用发送命令回复接收到的数据,它似乎可以来回处理 1-3 条消息,然后我进入死锁。我不明白死锁的根源来自哪里。下面是我的发送和接收实现。

客户端和服务器都以将 self.seqnumber 设置为 0 开始,并且两个套接字都设置为 1 秒后超时。客户端和服务器共享这些方法,因为它们属于客户端和服务器导入的类。

def sendCommand(self, command):
    self.s.sendto((self.seqnumber).to_bytes(8, "little") + command, self.address)
    try:
        data, self.address = self.s.recvfrom(1200)
        if int.from_bytes(data[:8], 'little') == self.seqnumber:
            self.seqnumber += 1
            return 0
        else:
            return self.sendCommand(command)
    except:
        return self.sendCommand(command)

def getCommand(self):
    while(1):
        try:
            data, self.address = self.s.recvfrom(1200)
            if int.from_bytes(data[:8], 'little') == self.seqnumber:
                self.s.sendto(data, self.address)
                self.seqnumber += 1
                break
            elif int.from_bytes(data[:8], 'little') < self.seqnumber:
                self.s.sendto(data, self.address)
            else:
                continue
        except:
            continue
    return data[8:]

在服务器上运行的代码(commInf 是定义 get 和 send 命令的类):

while (1):
        command = self.commInf.getCommand()
        print(command.decode())
        self.commInf.sendCommand(command)

以及在客户端上运行的代码:

for i in range(100):
    self.commInf.sendCommand(f"{i}".encode())
    command = self.commInf.getCommand()
    print(command.decode())

我希望输出允许我可靠地发送消息并使用 sendCommand(带有接收的数据)返回它们,因为从 getCommand 返回的数据不包括其序列号,而只是原始数据。

4

0 回答 0