我目前有一個使用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