현재 UDP 및 Python 소켓 모듈을 사용하는 데 문제가 있습니다. 우리는 서버와 클라이언트를 보유하고 있습니다. 이 문제는 사용자에게 데이터를 보낼 때 발생합니다. 클라이언트 크래시, ISP 연결 해제 또는 기타 부적절한 방법을 통해 사용자가 서버에 대한 연결을 종료했을 수 있습니다. 따라서 닫힌 소켓에 데이터를 보낼 수 있습니다.UDP 데이터에서 Python 소켓 오류가 발생합니다. (10054)
물론 UDP를 사용하면 데이터가 실제로 도달했는지 또는 닫혀 있는지 알 수 없으며 상관하지 않으므로 (적어도 예외는 발생하지 않음). 그러나 데이터를 보내고 닫으면 데이터가 어떻게 든 돌아오고 (???) 결국 sock.recvfrom에 소켓 오류가 발생합니다. [Errno 10054] 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다. 거의 자동으로 연결에서 응답을 보인다.
괜찮 으면 좋겠지 만 try : except : block (서버의 성능을 조금 떨어 뜨린 경우에도)으로 처리 할 수 있습니다. 문제는이게 누구에게서 왔는지, 어떤 소켓이 닫혀 있는지를 알 수 없다는 것입니다. 어쨌든 'who'(ip, socket #)가 이것을 보냈습니다. 즉시 연결을 끊고 데이터에서 제거 할 수 있다면 좋을 것입니다. 어떤 제안? 감사.
는 서버 :
는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 문제는 아닙니다. 당신에게 문제를 일으키는 최소한의 코드를 보여줄 수 있습니까? 가장 작은 코드 조각을 클라이언트와 서버에서 격리 시키십시오. –
그래,이 예제 코드를 사용하여 상당히 쉽게 다시 만들었다. 붙여 넣기 지점을 사용할 수 있도록 여기에 붙여 넣을 수 있는지 잘 모르겠습니다. 서버 : http://paste-it.net/public/o230dad/ 클라이언트 : http://paste-it.net/public/k194612/ 기본적으로 서버와 클라이언트 두 개만 엽니 다. 루프가 got_data 될 때까지 기다린 다음 클라이언트 하나를 닫으십시오. 붐, 서버의 소켓 오류. – Charles
아마도이 대답이 유용 할 것입니다. 나를 위해, 그것은 : http://stackoverflow.com/questions/13844711/udp-hole-punching-c-winsock –