2010-05-14 4 views
3

소켓 클래스 (TCP)를 사용하여 서버에 연결하는 응용 프로그램을 프로그래밍했다고 가정 해 보겠습니다. 읽거나 쓰는 동안 SocketException이 발생하면 응용 프로그램의 상태를 Disconnected로 변경하기 위해 연결 루틴을 실행해야합니다.일부 상황에서 SocketExceptions을 삼키는 것이 좋습니까?

하지만 분리하기 시작했다면, 나는 청소하고있어하면서, SocketException이 발생 무엇?

SocketException은 실제로 아무 것도 의미하지 않습니다. 어쨌든 소켓을 종료하려고 했으므로 SocketException을 실제로 삼키지 않아도됩니까?

정말이 상황에 가장 적합한 방법이 무엇인지 알고 싶습니다.

+0

소켓을 닫으려고하는데 Read/Send 호출 중 하나가 "연결 재설정 (connection reset by peer)"또는 이와 비슷한 것에 대한 SocketException을 가져옵니다. 나는 그것을 마십니까? – NoPyGod

+0

여전히 다릅니다. 당신이 "안녕"이라고 쓰고 있다면 걱정할 것이 없습니다. 그러나 필수적인 것을 보내고 있다면 예외가 _ 발생합니다. –

답변

0

.net 소켓과 WCF 모두 소켓 예외를 항상 무시합니다.

전화가 비동기 적으로 전송되는 시간의 절반, 연결이 끊어지면 시간 초과가 발생할 때까지는 알 수 없습니다. 무시할 때까지는 무시하는 시간 초과 예외가 발생합니다.

0

연결이 끊어지는 동안 문제가 발생하면 소켓은 어떤 상태가됩니까? 최악의 경우, 리모트 소켓은 타임 아웃합니다. 그 상황을 해결하기 위해 할 수있는 일은 정말로 없습니다.

그러나 Joe R이 말한대로 메시지를 기록하십시오. Disconnect()이 두 번 호출되기 때문에 이러한 예외가 발생할 수도 있습니다. 이는 사용자가 알고 싶은 것입니다. (편집 : 그 예외를 일으킬 지 모르겠지만 내가 무슨 뜻인지 알기를 바랍니다 : P)

2

예외가 '정상적인'경우 상황이 있습니다. 내가 기억한다면 일부 프로토콜 (SMTP)에서 클라이언트는 적절한 닫기 명령을 보내지 않고 준비가되면 연결을 끊을 수 있습니다. 서버 측에서는 무해하다고 알려진 예외가 항상 발생합니다.

하지만 특정 위치에서만 특정 예외 유형을 삭제해야합니다.

1

특히 재 시도 메커니즘을 설계 할 때 여전히 일부를 삼켜 야합니다. 권리? 첫 번째 실패를 삼키지 않으면 어떻게 두 번째 시도를 초기화 할 수 있습니까?

관련 문제