2009-06-25 1 views
2

나는 서버 소켓을 열어 둔 우분투 7.04에서 동작하는 표준 소켓 API를 사용하는 C++ 프로그램을 가지고있다. 내 시스템은 라우터 뒤에 있습니다. 라우터가 네트워크에서 끊어진 후 내 프로그램이 전송을 시작하면 얼마나 오랫동안 소켓 오류가 발생하는지 파악하고 싶습니다.중급 네트워크 연결 끊김으로 인해 TCP 소켓이 죽는 데 필요한 최대 시간은 어떻게 결정합니까?

즉, 내 프로그램이 유휴 상태가 될 수 있습니다 (사용자를 기다리는 중입니다). 라우터가 인터넷에서 연결이 끊긴 다음 프로그램이 해당 소켓을 통해 통신을 시도합니다.

TCP는 불리한 네트워크 조건에서 소켓을 활성 상태로 유지하는 데 꽤 능숙하기 때문에 분명히 빨리 알 수는 없습니다. 이로 인해 TCP는 마침내 포기하기 전에 많은 시간, 많은 방법을 재 시도합니다.

QA 그룹 (및 고객)에게 줄 수있는 '최악의 경우'시간을 설정해야합니다. 그러면 내 코드가 적절한 오프라인 상태가되는지 테스트 할 수 있습니다.

(참고로 내 프로그램은 주유소 용 펌프 시스템의 일부이며 서버는 지불 거래를 승인하는 시스템입니다. 다양한 스테이션을 인터넷에서 차단할 수 있습니다. 이유 및 고객이 무엇을 기대하는지 알고 싶어하는 경우).

편집 : 명확하지 않았습니다. 이 일을 기다리는 인간은 없습니다. 이것은 시스템 오피스를 오프라인으로 표기하기위한 것입니다. 30 초 내에 인증 정보가 다시 나오지 않으면 트랜잭션이 끝나고 사람들은 다른 일을 수행하게됩니다.

편집 : 일반적인 경우에는 질문에 답할 수 없다는 결론에 도달했습니다. TCP 연결이 다운 스트림 실패로 인해 오류를 발생하는 데 걸리는 시간을 결정하는 데 관련된 요소의 수는 간단한 장비에 대한 정확한 장비 및 실패에 너무 의존합니다.

답변

2

당신은 사용할 수 있어야합니다 :와

http://linux.die.net/man/2/getsockopt

:

SO_RCVTIMEO 및 SO_SNDTIMEO

가 관련된 시간 제한을 결정합니다.

이 링크 : 당신에게 관심을 가질 수있는 더 많은 옵션에 대한 http://linux.die.net/man/7/socket

회담.

제 경험상, 시간을 선택하는 것은 대개 나쁜 생각입니다. 합리적이라고 들릴지라도 실제로는 임의의 타임 아웃이 일반적으로 오작동합니다. 일반적인 결과는 환경이 표준을 벗어나면 응용 프로그램을 사용할 수 없게된다는 것입니다.

특히 금융 거래의 경우이를 피해야합니다. 아마도 취소 버튼을 제공하고 트랜잭션이 예상보다 오래 걸린다는 표시는 더 나은 해결책이 될 것입니다.

1

저는 다른 방법으로 질문을 뒤집을 것입니다. 영업 담당자가 말하기 전에 고객 앞에서 어리석은 자세로 준비 할 때까지 얼마나 오랫동안 작동하지 않아야 수동 방식으로 처리 할 수 ​​있습니까?

그래서 일분처럼 시간을 선택

그런 다음 프로그램이 포기하기 전에 대기하는 시간에 그 시간을 사용 (네트워크를 가정하는 트래픽이 발생하면 다시 연결합니다 따라서 자동 분리하지 않고,). 소켓을 닫습니다. 오류 메시지를 표시합니다. 어쩌면 기다리는 동안 카운트 다운 타이머 일 수도 있으므로 운영자가 시스템이 얼마나 오래 기다릴 것인지 생각할 수 있습니다 ...

그러면 트랜잭션이 실패하고 수동 시간입니다.

그렇지 않으면 IP 스택에 따라 최악의 경우 시간 초과가 '절대로 시간 초과'될 수 있습니다.

+0

나는 내 질문을 편집했습니다.이 사람은 기다리지 않아도됩니다. 트랜잭션 시간이 빠르며 빠릅니다. –

1

최선의 방법은 사용되는 제한 시간을 확인하지 말고 실제로 시간 초과를 지정하는 것입니다.

당신의 OS 중 하나를 수행 할 수 있습니다에 따라 : - 옵션 SO_SNDTIMEO와

  • 사용하여 setsockopt(),
  • 사용 비 블로킹 타임 아웃
  • 사용하여() 사용을 선택하고 다음 (전송) 및 non-blocking send()를 호출하고 예상되는 데이터를 수신하면 시간 초과가 발생합니다.
관련 문제