让我解释一下我正在做的应用程序。
我正在为多个和并发客户端创建一个中央UDP(需要是UDP)服务器,这些客户端也在它们之间“对话”。 我检查已知客户端地址的字典,并创建一个客户端处理程序线程,如果“我不知道”客户端。否则,线程接收数据广告完成其工作。 新线程接收对套接字和调用者地址的引用,因此它们将socket.sendTo与该地址和数据一起使用。
当客户端关闭它的客户端(Alt + F4)并且有人与em通话时出现问题,导致套接字抛出10054错误,“套接字连接重置”。我认为在UDP中没有预料到。 客户端线程上的“talk”方法也介于try&除了标签,但仍然是UDP服务器“recvfrom”触发异常的那个。
我正在使用Python 2.5(代码需要它)和这个套接字选项:
host = "0.0.0.0"
port = 10000
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
UDPSock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
UDPSock.bind((host,port))
有一些选项可以让我做我想做的事情或者一个解决这个问题的图书馆吗?
或者如果我做错了...有一种方法可以做/模拟与线程TCP套接字相同的行为(在接受时创建一个新的客户端处理程序线程)但是使用UDP?
感谢阅读;)
答案 0 :(得分:1)
发生'套接字重置'是因为客户端发送了一个ICMP端口不可达,以响应发送到不再存在的套接字的数据报。在API中表达它的完美合理的方式,所以你只需要处理它。但是,如果你只是忽略异常,套接字应该仍然有效。