2012-11-07 7 views
3

C/S 애플리케이션이 있습니다. 클라이언트는 일반적으로 TCP 프로토콜을 사용하여 서버에 많은 양의 데이터를 보냅니다. LAN 환경 (10MB/s)에서는 잘 작동하지만 WAN 환경 (200KB/s)으로 마이그레이션하면 네트워크 오류가 발생합니다.WSAECONNABORTED 오류를 수정하는 방법?

내가 버그를 추적하면 클라이언트의 send()이 -1을 반환하고 WSAGetLastError()이 처음에 WSAECONNABORTED을 반환한다는 것을 알았습니다. 그리고 몇 초 후 서버의 recv()도 -1을 반환하고 errnoECONNRESET입니다.

문서를 참조한 후 기본 이해가 WSAECONNABORTEDECONNRESET입니다. 나는 이전이 나쁜 네트워크에서 비롯된 것이라고 생각한다 : TCP는 몇 가지 재전송 실패 후에 소켓을 닫는다. 후자는 의뢰인의 예상치 못한 폐쇄 작전의 결과입니다.

이런 종류의 오류를 어떻게 처리해야하는지 궁금합니다. 즉시 다시 연결 하시겠습니까? 아니면 어떤 소켓 옵션이 도움이 될 수 있습니까?

+1

대부분의 오류 코드와 마찬가지로 WSAECONNABORTED는 많은 원인이 있습니다. 가장 일반적인 것은 shutdown() 또는 closesocket()에 의해 다른 곳에서 수정 된 소켓을 사용하려고 할 때입니다. FD_CLOSE 이벤트를 처리하는 타이밍을 확인합니다. FD_READ 이후에 FD_CLOSE를받는 것이 완벽하게 가능하며, 소켓이 닫히기 전에 읽기 기능이 끝나지 않았습니다. 변함없이 문제는 소프트웨어가 네트워크 이벤트를 처리하는 방식이거나보다 정확하게는 이러한 이벤트를 처리하는 방식 일 것입니다. 희망이 도움이됩니다. : o) – curzonnassau

답변

1

정확합니다.

전자는 네트워크 문제로 인한 것입니다. 새 소켓으로 다시 시도하십시오.

후자는 응용 프로그램 프로토콜 오류입니다. 피어가 이미 닫힌 상태에서 보냈습니다. 이것은 응용 프로그램 버그입니다. 치료법은 버그를 수정하는 것입니다.

+0

"치료법은 버그 수정"+1 –

관련 문제