문제

연결 시간 초과가 발생하면 소프트웨어에 버그가 발생했습니다.이러한 오류는 매우 드뭅니다(보통 내부 네트워크에서 연결이 끊어지는 경우).소프트웨어를 테스트할 수 있도록 이러한 종류의 효과를 인위적으로 생성하려면 어떻게 해야 합니까?

중요한 경우 앱은 CAsyncSocket 클래스를 사용하여 C++/MFC로 작성됩니다.

편집하다:

존재하지 않는 호스트를 사용하려고 시도했는데 소켓 오류가 발생했습니다.

WSAEINVAL (10022) 잘못된 인수

다음 시도는 알렉산더다른 포트에 연결하라는 의 제안.81 (내 서버에서는).그것은 훌륭하게 작동했습니다.연결이 끊어진 것과 정확히 동일합니다(60초 대기 후 오류).감사합니다!

도움이 되었습니까?

해결책

기존 호스트에 연결하지만 단순히 TCP SYN 패킷을 삭제하는 방화벽에 의해 차단된 포트에 연결합니다.예를 들어 www.google.com:81입니다.

다른 팁

10.255.255.1과 같이 라우팅할 수 없는 IP 주소에 연결합니다.

Unix 시스템을 사용하는 경우 netcat을 사용하여 포트 수신을 시작할 수 있습니다.

nc -l 8099

그런 다음 해당 포트에서 일반적으로 수행하는 작업을 호출하도록 서비스를 수정합니다. http://localhost:8099/some/sort/of/endpoint

그러면 서비스가 연결을 열고 데이터를 쓰지만 응답을 받지 못하므로 읽기 시간 초과(연결 거부 대신)가 발생합니다.

다음 URL은 항상 시간 초과를 제공하며 위의 @Alexander와 @Emu의 답변 중 최고를 결합합니다.

http://example.com:81

사용 example.com:81 example.com은 DNS 표준에 따라 예약되어 있으므로 Alexander의 답변이 개선되었으므로 항상 연결할 수 없습니다. google.com:81, Google이 원할 경우 변경될 수 있습니다.또한 왜냐하면 example.com 도달할 수 없는 것으로 정의되어 있으면 Google 서버가 넘치지 않습니다.

기억하기가 훨씬 쉽기 때문에 @emu의 답변보다 개선되었다고 말하고 싶습니다.

Python REPL을 사용하여 데이터를 수신하는 동안 시간 초과를 시뮬레이션할 수 있습니다(예:연결이 성공적으로 설정된 후).표준 Python 설치 외에는 아무것도 필요하지 않습니다.

Python 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        
>>> s.bind(('localhost', 9000))
>>> s.listen(0)
>>> (clientsocket, address) = s.accept()

이제 들어오는 연결을 기다립니다.테스트하고 싶은 모든 것을 연결하세요 localhost:9000.그렇게 하면 Python은 연결을 수락하고 accept() 그것을 돌려줄 것이다.데이터를 전송하지 않는 이상 clientsocket, 호출자의 소켓은 다음 시간 동안 시간 초과되어야 합니다. recv().

  • 10.0.0.0
  • 10.255.255.255
  • 172.16.0.0
  • 172.31.255.255
  • 192.168.0.0
  • 192.168.255.255

이 모든 것들은 라우팅할 수 없습니다.

모두의 관심을 집중시키고 싶습니다 경로

구성(예제에서 가져옴)을 사용하면 다음과 같습니다. 200:b@100:dr 무작위로 연결이 끊기는 현상이 발생합니다.

소프트웨어 솔루션은 어떻습니까?

애플리케이션 서버에 SSH 서버를 설치합니다.그런 다음 소켓 터널을 사용하여 로컬 포트와 애플리케이션 서버의 원격 포트 사이에 링크를 만듭니다.SSH 클라이언트 도구를 사용하면 됩니다.대신 클라이언트 애플리케이션을 매핑된 로컬 포트에 연결하세요.그런 다음 원하는 대로 소켓 터널을 중단하여 연결 시간 초과를 시뮬레이션할 수 있습니다.

활성 연결을 사용하려면 다음을 사용할 수도 있습니다. http://httpbin.org/delay/#, 여기서 #은 서버가 응답을 보내기 전에 기다리는 시간입니다.제한 시간이 지연 시간보다 짧은 한 ...효과를 시뮬레이션해야 합니다.Python 요청 패키지와 함께 성공적으로 사용했습니다.

민감한 내용을 보내는 경우 요청을 수정하고 싶을 수도 있습니다. 전송된 데이터가 어떻게 되는지 전혀 알 수 없습니다.

서버가 응답하는 데 걸리는 시간을 지정하는 API를 호출하여 인위적으로 원본 시간 초과를 생성할 수 있는 서비스가 있습니다.macgyver의 서버 시간 초과가 그러한 서비스의 예입니다.

예를 들어 응답하는 데 15초가 걸리는 요청을 테스트하려면 간단히 macgyver API에 게시 요청을 하면 됩니다.

JSON 페이로드:

{
    "timeout_length": 15000
}

API 응답(15초 후):

{
    "response": "ok"
}

macgyver의 서버 시간 초과 프로그램
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u

별도의 인터페이스를 생성하는 Microsoft Loopback 드라이버를 설치할 수도 있습니다.그런 다음 귀하의 일부 서비스(귀하의 호스트)에 연결할 수 있습니다.그런 다음 네트워크 연결에서 해당 인터페이스를 비활성화/활성화할 수 있습니다.

OP가 어느 것을 테스트하고 싶은지 완전히 명확하지 않음에도 불구하고:존재하지 않는 호스트/포트에 대한 연결을 시도하는 것과 이미 설정된 연결의 시간 초과 사이에는 차이가 있습니다.나는 Rob과 함께 가서 연결이 작동할 때까지 기다린 다음 케이블을 당길 것입니다.또는 편의를 위해 가상 머신을 테스트 서버로 사용하고(브리지 네트워킹 사용) 연결이 설정된 후 가상 네트워크 인터페이스를 비활성화합니다.

무작위 연결 시간 초과를 시뮬레이션하기 위해 자주 사용하는 기술은 SSH 로컬 포트 ​​전달을 사용하는 것입니다.

ssh -L 12345:realserver.com:80 localhost

이것은 LocalHost : 12345에서 RealServer.com:80에서 트래픽을 전달합니다.

ssh -L 12345:localhost:8080 localhost

따라서 애플리케이션이 로컬 호스트 및 사용자 정의 포트를 가리키도록 하면 트래픽이 대상 호스트:포트로 라우팅됩니다.그런 다음 이 셸을 종료할 수 있으며(종료한 후 셸을 Ctrl+C해야 할 수도 있음) 전달이 중단되어 앱에서 연결 손실이 발생합니다.

다른 연결/케이블이 없는 스위치에 네트워크 케이블을 연결하십시오.그게 효과가 있을 것 같아요.

네트워킹 문제를 시뮬레이션하기 위해 과거에 사용한 몇 가지 전술이 있습니다.

  1. 네트워크 케이블을 뽑아보세요
  2. 컴퓨터와 "대상" 컴퓨터 사이의 스위치를 끄십시오(이상적으로는 컴퓨터가 연결된 스위치의 전원이 계속 켜져 있으므로 컴퓨터가 "네트워크 연결"을 유지함).
  3. 수신된 데이터를 자동으로 삭제하는 대상 시스템에서 방화벽 소프트웨어를 실행합니다.

이러한 아이디어 중 하나는 필요한 시나리오를 인위적으로 생성하는 수단을 제공할 수 있습니다.

설치/사용 가능한 방화벽 소프트웨어에 따라 나가는 포트를 차단할 수 있어야 하며 방화벽 설정 방법에 따라 연결 요청 패킷을 삭제해야 합니다.연결 요청 없음, 연결 없음, 시간 초과가 발생합니다.라우터 수준에서 구현되면 더 잘 작동할 수 있지만(재설정을 보내는 대신 패킷을 삭제하는 경향이 있거나 상황에 상응하는 모든 것) 트릭을 수행하는 소프트웨어 패키지도 있을 것입니다.

가장 쉬운 방법은 다음을 사용하여 연결을 끊는 것입니다. 현재 포트.

그러나 예외 처리 코드를 단위 테스트하려면 네트워크 연결 코드를 추상화하고 요청 시 예외를 발생시키는 스텁, 모의 또는 데코레이터를 작성해야 할 수도 있습니다.그러면 실제로 네트워크를 사용하지 않고도 애플리케이션 오류 처리 논리를 테스트할 수 있습니다.

나도 당신과 같은 문제가 있었습니다.소프트웨어 동작을 테스트하기 위해 적절한 시점에 네트워크 케이블을 뽑았습니다.케이블을 분리하기 직전에 중단점을 설정해야 했습니다.

다시 이 작업을 수행한다면 네트워크 케이블에 스위치(일반적으로 닫히는 순간 누름 버튼 1개)를 넣을 것입니다.

물리적 연결 해제로 인해 다른 동작이 발생하는 경우 컴퓨터를 저렴한 허브에 연결하고 위에서 언급한 스위치를 허브와 기본 네트워크 사이에 놓을 수 있습니다.

- 편집- 많은 경우 프로그램의 특정 지점에 도달 할 때까지 네트워크 연결이 작동해야합니다. 그러면 제공된 많은 제안 중 하나를 사용하여 연결을 끊어야합니다.

나에게 가장 쉬운 방법은 대상 네트워크를 기반으로 사무실 라우터에 고정 경로를 추가하는 것이었습니다.응답하지 않는 일부 호스트(예:컴퓨터) 요청 시간 초과가 발생합니다.

나에게 가장 좋은 점은 웹 인터페이스를 통해 정적 경로를 관리하고 쉽게 활성화/비활성화할 수 있다는 것입니다.

좋은 답변이 많지만 가장 깨끗한 솔루션은 다음과 같습니다. 이 서비스

http://httpstat.us/504?sleep=60000

제한 시간(최대 230초)과 최종 반환 코드를 구성할 수 있습니다.

외부에서는 사용할 수 없는 포트(예: 200)를 통해 잘 알려진 웹 사이트 중 하나에 연결을 시도할 수 있습니다.대부분의 방화벽은 DROP 모드에서 작동하며 시간 초과를 시뮬레이션합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top