我目前有一个使用UDP和Python套接字模块的问题。我们有一台服务器和客户端。当我们向用户发送数据时会出现问题。用户可能已经通过客户端崩溃关闭了与服务器的连接,通过ISP断开连接或其他一些不正确的方法。因此,可以将数据发送到封闭的套接字。UDP数据接收上的Python套接字错误。 (10054)
当然用UDP你不能,如果数据真的达到或知道它是封闭的,因为它不照顾(ATLEAST,它并不带来了一个例外)。但是,如果您发送数据并关闭数据,则会以某种方式返回数据(???),最终会给sock.recvfrom带来套接字错误。 [Errno 10054]现有连接被远程主机强制关闭。几乎看起来像来自连接的自动响应。
虽然这是罚款,并可以通过尝试来处理:除了:块(即使它降低了服务器一点点的性能)。问题是,我无法分辨这是从哪里来的,或者哪个socket被关闭了。无论如何找出'谁'(IP,套接字#)发送这个?这将是非常好的,因为我可以立即断开它们并将它们从数据中移除。有什么建议么?谢谢。
服务器:
import socket
class Server(object):
def __init__(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.connected = {}
def connect(self):
self.socket.bind(('127.0.0.1', 5579))
def find_data(self):
while 1:
data, address = self.socket.recvfrom(1024)
self.got_data(data,address)
if self.connected.has_key(address):
pass
else:
self.connected[address] = None
def got_data(self, data, address):
print "GOT",data,"FROM",address
for people in self.connected:
print people
self.send_data('hi', people)
def send_data(self, data, address):
self.socket.sendto(data,address)
if __name__ == '__main__':
server = Server()
server.connect()
print "NOW SEARCHING FOR DATA"
server.find_data()
客户:
import socket, time
class Client(object):
def __init__(self):
self.socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
def connect(self):
self.socket.connect(('127.0.0.1', 5579))
def send_data(self):
self.socket.sendto('hi',('127.0.0.1', 5579))
def got_data(self, data, address):
print "GOT",data,"FROM",address
if __name__ == '__main__':
client = Client()
client.connect()
while 1:
client.send_data()
time.sleep(5)
它似乎不是没有连接的UDP问题。你能显示导致问题的最小代码吗?请尝试隔离客户端和服务器上最小的代码块。 – 2010-04-05 04:45:51
好吧,我用这个示例代码很容易地重新创建了它。我不确定我可以在这里粘贴所有的东西,所以我会使用粘贴位置。 服务器:http://paste-it.net/public/o230dad/ 客户端:http://paste-it.net/public/k194612/ 基本上,只需打开服务器和两个客户端。等待它循环got_data,然后关闭一个客户端。繁荣,在服务器的套接字错误。 – Charles 2010-04-05 05:24:05
也许这个回答很有用。对我来说,这是:http://stackoverflow.com/questions/13844711/udp-hole-punching-c-winsock – 2016-03-29 15:12:50