2013-04-22 1 views
0

이 분산 컴퓨팅 프로젝트에서 작업 중입니다. '노드'중 일부를 시뮬레이션하지 않아도됩니다. 즉, 어떤 경우에도 읽기 또는 쓰기가 불가능합니다. 나가는 tcp connections.One 방법은 메시지를 읽고 버리는 것이지만 C/C++에서 inbuilt 옵션을 찾고 소켓이 들어오는 메시지를 버리도록 설정할 수 있습니다.C++에서 소켓 읽기/쓰기 버퍼를 비우는 방법

답변

2

소켓을 닫음으로써 오류를 시뮬레이트하면 문제가 발생하는 경우가 많습니다. 입니다. 닫힌 지점과 응답하지 않는 지점을 모두 테스트하려고합니다. 소켓을 닫는 것과 같은 호스트 솔루션은 호스트 오류를 ​​시뮬레이트하지만, 네트워크 오류는 애플리케이션/OS 지원 솔루션에서 필요합니다.

폐쇄 된 소켓은 스스로 청소합니다. 닫힌 소켓으로 실행중인 OS는 액세스하려고하면 오류를 반환합니다. 이 모든 것들은 당신이 확인해야 할 것들입니다. 그러나 실제 장애는 특히 호스트와는 달리 네트워크에서 패킷을 삭제합니다. 이렇게하면 tcp가 종료되는 동안 시스템이 대기 할 수 있습니다.

네트워크 장애를 시뮬레이트하는 가장 좋은 방법은 방화벽 규칙입니다. 방화벽에서 연결의 한쪽 또는 양쪽 끝을 차단하여 네트워크 오류를 시뮬레이트합니다. iptables 및 다른 솔루션을 사용하면 패킷 또는 패킷의 일부를 특정 특성으로 삭제할 수 있습니다.

+0

방화벽 솔루션이이 문제에 대한 올바른 해결책은 아니지만 소켓을 닫는 대신 장애 노드로 항상 응답 한 좀비로 바꿨습니다. 그 일종의 돌봐. –

2

"실패한"노드가 사용중인 모든 소켓을 닫으십시오.

질문에 언급되지 않은 OP 노드 응용 프로그램이 어떻게 수행되는지에 따라 ... 실패한 노드를 시뮬레이션하는 가장 쉬운 방법은 노드 응용 프로그램을 '종료'한 다음 모든 TCP '닫기'패킷을 건너 뛰고 다른 노드 연결이 끊어 졌거나 (첫 번째 단계로서) 노드의 모든 통신 소켓을 수동으로 닫을 때 인식하지 못합니다. 이는 다른 노드가 '적절한'방식으로 닫힌 연결을 인식 할 것이지만 특정 노드에서 시스템의 나머지 동작이 손실되는 방식을 확인하기에 충분하기 때문에 실험을 완전히 정리하지는 못함을 의미합니다.

+0

그게 무슨 뜻이야? – Jean

+0

나는 내가 말한 것을 정확하게 의미했다. OP 노드 응용 프로그램이 어떻게 수행되는지 (질문에 언급되지 않은) 방법에 따라 ... 실패한 노드를 시뮬레이션하는 가장 쉬운 방법은 노드 응용 프로그램을 '종료'한 다음 모든 TCP '닫기'패킷을 건너 뛰고 다른 노드가 인식하지 못하게하는 것입니다 연결이 끊어 지거나 (첫 번째 단계로) 노드의 모든 통신 소켓을 수동으로 닫습니다. 이는 다른 노드가 '적절한'방식으로 닫힌 연결을 인식 할 것이지만 특정 노드에서 시스템의 나머지 동작이 손실되는 방식을 확인하기에 충분하기 때문에 실험을 완전히 정리하지는 못함을 의미합니다. – evilruff

+0

하지만 문제는 '생각할 곳'없이 곧바로 완전한 대답을하면 뇌의 손상이 심할 수 있다는 것입니다. 올바른 방향을 가리키면 다음과 같은 준비가 된 답이 훨씬 더 많을 것입니다. 왜 그런 식으로해야하는지 이해하십시오. – evilruff

관련 문제