2012-08-27 3 views
5

저는 주어진 포트에서 UDP 패킷을 듣고 파이썬으로 놀고 있습니다. 모든 것이 잘 작동하는 것처럼 보입니다. 그러나 오랜 시간이 지나면 스크립트가 다음 오류로 인해 충돌합니다 :파이썬 '동료에 의한 연결 재설정'

data = self._sock.recv(self._rbufsize) 
socket.error: [Errno 54] Connection reset by peer 

스크립트 만 다시 시작하면 짧은 시간 후에 동일한 충돌이 다시 발생합니다. 대신 서버를 다시 시작하면 잠시 동안 문제가 완전히 해결 된 것으로 보입니다. 사물의 소켓 측면과 관련하여

, 내가하고 있어요 :

UDP_IP = "0.0.0.0" 
UDP_PORT = 6000 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind((UDP_IP, UDP_PORT)) 

내가 뭔가를 분명 없거나 그냥이를 방지하는 간단한 방법이 있습니까?

어떤 빛이든 미리 감사드립니다. 서버로부터의 패킷에 :

벤지

답변

5

오류 UDP 소켓의 "피어 연결 재설정"클라이언트 (포트 연결할, TTL 초과 등의 예)를 ICMP 에러 메시지를 수신했음을 의미 그것은 보냈습니다.

내가 코드에서이 원인을 확실히 말할 수는 없지만, 나는이 개 아이디어를 제공 할 수 있습니다 :

연결이 정말 뭔가에 의해 중단되었다
  1. (라우팅 문제, 서버 측 오류 등) . 이 경우이 오류를 확인할 수 있으며 오류가 발생하면 소켓을 다시 열 수 있습니다.
  2. 나보다 가능성이 높지만 익숙하지 않은 것 같습니다. 즉 SO_REUSEADDR이 문제의 원인입니다. 이 소켓 옵션을 사용하면 동일한 포트에서 여러 개의 소켓을 열 수 있습니다. 이 발생합니다. 다른 프로세스가 포트 6000을 사용하려고 시도하고, OS가이를 차단하지 않도록 OS에 알리기 때문에 성공하며, 소켓이 OS에 의해 닫힙니다. UDP 소켓에 SO_REUSEADDR을 사용할 이유가 없으므로 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 줄을 제거하고 다시 시도하십시오.

행운을 빈다.

관련 문제