2014-09-10 1 views
1

파이썬에서 간단한 소켓 프로그래밍을하려고합니다. 필자는 파이썬에서 입력을 받아들이고 응답을 보내는 UDP 서버를 가지고 있습니다. 클라이언트 코드에 문제가 있습니다.Python UDP 소켓이 recvfrom()에서 즉각적인 오류를 던졌습니다.

sock = socket.socket(
    socket.AF_INET, socket.SOCK_DGRAM 
) 
sock.bind(('0.0.0.0', 0)) 
sock.settimeout(2) 
sock.sendto(json.dumps({ 
    'operation': operation, 
    'operands': [operand1, operand2] 
}), (host, port)) 

print sock.recvfrom(4096) 

이 코드는 서버가 실행 중일 때 완벽하게 작동합니다. 그러나 서버를 실행하지 않고 코드를 실행하면 recvfrom()을 차단하는 대신 즉시 코드가 예외를 throw합니다.

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host 

잠시 후 원하는 기능이 시간 초과됩니다. 누구든지 내가 뭘 잘못하고 있다고 설명 할 수 있습니까? 나는 서버 코드에서 recvfrom을 사용하고 블록하므로 약간의 차이점이있다.

답변

0

많은 이유가있을 수 있습니다.

소켓 오류 [10054]는 연결 재설정을 의미합니다.

기존 연결이 원격 호스트에 의해 강제로 닫혔습니다. 일반적으로 원격 호스트의 피어 응용 프로그램이 갑자기 중지되거나 호스트가 재부팅되거나 호스트 또는 원격 네트워크 인터페이스가 사용되지 않거나 원격 호스트가 하드 닫기를 사용하는 경우 (원격 호스트의 SO_LINGER 옵션에 대한 자세한 내용은 setsockopt 참조) 소켓). 하나 이상의 작업이 진행 중일 때 연결 유지 활동이 실패를 감지하여 연결이 끊어지면이 오류가 발생할 수도 있습니다. 진행중인 작업은 WSAENETRESET을 사용하여 실패합니다. WSAECONNRESET으로 후속 작업이 실패합니다.

자세한 내용은 link을 확인하십시오.

실제 발생 원인을 알아 내기 위해 조사해야합니다. 나는 당신의 환경이 없기 때문에 실제 문제가 무엇인지 찾아 낼 수 없다. 희망이 도움이됩니다.

0

SOCK_DGRAM 유형이 있으므로 전 답변 중 많은 부분이 적용되지 않습니다. 이자형. UDP 소켓. 오류 메시지가 연결에 대해 이야기하더라도 UDP는 연결없는 서비스입니다. 예외는 포트가 도달 할 수 없다는 것을 알리는 sendto 데이터 그램에 대한 응답으로 대상 호스트로부터의 통지로 인해 발생합니다. 이 알림은 recvfrom에 전화하기 전에 처리 된 것입니다 (아마도 도착할 수도 있습니다). 자동 재시도 기능은 없습니다. recvfrom (아마도 sendto)을 다시 시도하고 원하는 시간 제한을 직접 구현해야합니다.

관련 문제