1

情况:服务器接收连接的客户端,并等待它们发出请求。

问题:当客户端连接时,服务器为它们创建的套接字被分配了变量clientsocket。当客户提出请求时,他们会从大厅的客户列表中删除。但是,如果两个客户端连接但不发出请求,则最后一个连接的客户端将成为变量clientsocket

问题的影响:如果第一个连接的客户端决定发出请求,则从大厅列表中删除变量 clientsocket。但是,clientsocket 将不是指第一个客户端,而是第二个(或最后一个连接)。因此,当第二个发出请求时,会生成一个错误,指出无法从大厅中删除 clientsocket,因为它不再存在于大厅列表中。同时,客户端 1 仍然存在。

这是我正在谈论的代码片段:

rlist,wlist,xlist = select.select([Listeningsocket]+ Connection_List,[],[])
    for i in rlist:
        if i == Listeningsocket:
            clientsocket,address = Listeningsocket.accept()
            Connection_List.append(clientsocket)

            continue
        else:
            try:
                data = i.recv(512)
            except IOError:
                data = ""
            if data:
                clientsocket = # <--- UPDATE CLIENT WITH CORRECT SOCKET
                Request_Type = str(data.decode())

如您所见,我需要做的是确保当我收到数据时,发送数据的 clientsocket 成为变量 clientsocket,而不是最后一个连接的。

data = i.recv(512) 但有什么方法可以确定是哪个套接字发送的?

尝试谷歌搜索,但我认为没有人有这个问题。我希望这不是太具体。我确定其他人可能也想确定发送数据的套接字。

4

1 回答 1

1

一遍又一遍地使用全局可见clientsocket是等待发生的意外。您应该只更改要使用的代码i- 这也是一个套接字。

data = i.recv(512) 但有什么方法可以确定哪个套接字发送了这个

就像我说的,i是那个插座。

于 2013-09-25T07:51:59.857 回答