2010-01-14 5 views
6

소켓 오류를 시뮬레이트하는 방법은 무엇입니까? (때로는 일부 소켓 오류로 인해 서버 또는 클라이언트 연결이 끊어지며이를 재현 할 수 없습니다.) 이 작업을 수행 할 도구를 찾고 있었지만 찾을 수 없습니다. 누구나 도구를 알고 있거나이를 수행하는 방법에 대한 코드 예제가 있습니까? (C# 또는 C/C++)소켓 오류 시뮬레이션

+2

네트워크 케이블을 분리합니까? – Eclipse

답변

6

소켓에 액세스하는 데 사용하는 API에 래퍼 레이어를 추가하여 rand() % 100> x % 시간 동안 실패하게 만듭니다.

+0

ok, 확실하지는 않습니다. .. 실패한 부분 .. – ra170

+0

랩퍼 함수에서 @ ra170은 실제 함수를 호출하는 대신 오류 코드가 해당 API에 대해 "실패"를 의미하는 것으로 반환합니다. 시간 –

1

저는 이번 여름에 똑같은 문제가있었습니다.

사용자 정의 Socket 클래스가 있으며 read 또는 write이 예외를 던진 경우 어떤 일이 발생할지 테스트하고 싶습니다. 정말 프레임 워크를 조롱 자바를 모방하고 싶어, 나는 이런 식으로했다 :

가 나는 FakeSocket 클래스로 Socket 클래스를 상속, 뭔가가 SocketExpectation라고 만들었습니다. 그런 다음 유닛 테스트에서 가짜 소켓을 만들고 기대치를 설정 한 다음 가짜 소켓을 테스트하려는 코드로 전달했습니다.

uint32_t write(buffer, length); // calls check 
uint32_t read(buffer, length); // calls check 
bool matches(); 
void expect(expectation); 
uint32_t check(CallType, buffer, length) const; 

그들은있어 모든 꽤 정직 :

FakeSocket

는 (불필요한 사항의 제거) 이러한 방법이 있었다. check은 현재 예상과 비교하여 인수를 확인하고 계획에 따라 모든 것이 수행되면 SocketExpectation 요구 사항을 수행합니다. 내가 그들을 필요에 따라

typedef enum { write, read } CallType; 

SocketExpectation(CallType type); 
SocketExpectation &with_arguments(void *a1, uint32_t a2); // expects these args 
SocketExpectation &will_return(uint32_t value); 
SocketExpectation &will_throw(const char * e); // test error handling 
bool matches(); 

내가 더 방법을 추가하십시오 SocketExpectation

(또한 제거)이 윤곽을 가지고있다.

fake_socket = FakeSocket(); 
fake_socket.expect(SocketExpectation(write).with_arguments(....).will_return(...)); 
fake_socket.expect(SocketExpectation(read).with_arguments(...).will_throw("something")); 
+0

읽기 및 쓰기 예외를 throw 할 수 없습니다. –

+0

예기치 않은 연결이 발생한 경우 예외를 throw하는 사용자 정의 소켓 클래스입니다. – laura

0

나는 '모의'에 연결하기 위해 테스트중인 코드를 드라이브로 내 소켓 코드 단위 테스트는 아마 더 나은 통합 테스트로 설명되어 있습니다 : I는 관련 법에 가짜 소켓을 통과,이처럼 만들 것 원격 피어. 원격 피어는 테스트 (단순히 클라이언트 또는 서버 일뿐) 때문에 테스트를 통해 원격 피어가 다양한 방식으로 연결을 중단시키고 테스트중인 코드가 예상대로 반응하는지 확인할 수 있습니다. 설정하는 데는 약간의 작업이 필요하지만 모든 조각을 확보하면 대부분의 상황을 테스트하는 것이 매우 쉽습니다.

내 생각에, 당신이 직면 한 상황을 시뮬레이션하려고 시도하는 것이 아니라 그것을 이해하고 안정적으로 생성해야한다는 것입니다.