Tạo lỗi nhân tạo kết nối


291

Tôi đã gặp lỗi trong phần mềm của chúng tôi xảy ra khi tôi nhận được thời gian chờ kết nối. Những lỗi này rất hiếm khi xảy ra (thường là khi kết nối của tôi bị rớt mạng nội bộ). Làm thế nào tôi có thể tạo ra loại hiệu ứng này một cách nhân tạo để tôi có thể kiểm tra phần mềm của chúng tôi?

Nếu có vấn đề, ứng dụng được viết bằng C ++ / MFC bằng các lớp CAsyncSocket.

Biên tập:

Tôi đã thử sử dụng máy chủ không tồn tại và tôi gặp lỗi ổ cắm:

WSAEINVAL (10022) Đối số không hợp lệ

Nỗ lực tiếp theo của tôi là sử dụng đề xuất kết nối với một cổng khác của Alexander , ví dụ 81 (trên máy chủ của riêng tôi). Điều đó đã làm việc tuyệt vời. Chính xác giống như một kết nối bị mất (chờ 60 giây, sau đó lỗi). Cảm ơn bạn!


Xin chào Mark, tôi đã thử giải pháp phù hợp với bạn nhưng những gì tôi nhận được là # 503 (Dịch vụ không khả dụng.). Không nên là một trong số này, # 504 (Hết thời gian chờ cổng), # 599 (Lỗi hết thời gian kết nối mạng), # 598 (Lỗi hết thời gian đọc mạng).
CoDe

Câu trả lời:


297

Kết nối với một máy chủ hiện có nhưng với một cổng bị chặn bởi tường lửa chỉ đơn giản là làm rơi các gói TCP SYN. Ví dụ: www.google.com:81.


6
Câu trả lời này rất đơn giản và hoạt động giống như câu trả lời của @ emu bên dưới. Tôi hiểu câu trả lời này không có ý định đề xuất sử dụng google.com:81 nhưng vấn đề ở đây là sử dụng một cổng khác bị chặn. Vì vậy, bạn luôn có thể sử dụng <your-own-ip>: <block-port>.
James Selvakumar

6
Trừ khi máy chủ của riêng bạn, thô lỗ khi đánh các máy chủ khác để thử nghiệm. Sử dụng một giải pháp văn minh như một emu được đề cập dưới đây, bằng cách nhấn một địa chỉ IP không thể định tuyến như 10.255.255.1 hoặc thiết lập một máy chủ ảo của riêng bạn cho mục đích thử nghiệm.
zeeshan

2
Tôi nghĩ rằng Google có thể đã chặn cổng này. Khi tôi kiểm tra điều này với Chrome, tôi chỉ "Máy chủ không khả dụng". Khi tôi sử dụng thủ thuật của @ emu bên dưới, kết nối sẽ bị treo như mong đợi. Tui bỏ lỡ điều gì vậy?
entpnerd

OP cho biết anh đã kết nối với cổng 81 trên máy chủ của mình và hết thời gian chờ. Điều đó cũng làm việc cho tôi. Giải pháp của emu đã cho tôi một UnknownhostException trên Android.
Barry Fruitman

2
Điều này sẽ cung cấp cho một kết nối từ chối không hết thời gian.
Mehdi

425

Kết nối với một địa chỉ IP không thể định tuyến, chẳng hạn như 10.255.255.1.


12
Idem, và tôi đoán đây là một câu trả lời tốt hơn vì google.com:81 có thể truy cập được vào một ngày nào đó.
Gui13

138
... Và bởi vì việc gửi các gói ngẫu nhiên đến các máy chủ của người khác từ các bài kiểm tra đơn vị của bạn là thô lỗ.
Glenn Maynard

15
Điều này sẽ không luôn luôn làm việc. Chẳng hạn, với Python urllib, điều này sẽ trả về ngoại lệ 'Không có tuyến đến máy chủ'. FYI
Mike Shultz

8
10.0.0.0, 10.255.255.255, 172.16.0.0, 172.31.255.255, 192.168.0.0, 192.168.255.255 tất cả những thứ này đều không thể định tuyến.
rajesh_kw

4
Lỗi "Không có đường đến máy chủ" được đề cập bởi @FHI thường xuất hiện trong hai điều kiện: (a) khi bạn thử kết nối với máy chủ không thể truy cập trong mạng LAN cục bộ của mình (nghĩa là nó không trả lời các truy vấn ARP nên về cơ bản đó là " Hết thời gian chờ ARP "). Và (b) khi bộ định tuyến trả về lỗi ICMP tương ứng. Trường hợp đầu tiên xảy ra nếu bạn ở cùng mạng con với IP riêng mà bạn kiểm tra. Trường hợp thứ hai nếu bộ định tuyến không biết cách định tuyến gói của bạn đến đích, nhưng trong một số trường hợp, họ chỉ bỏ gói mà không gửi lỗi ICMP.
Ale

47

Nếu bạn đang sử dụng máy unix, bạn có thể bắt đầu nghe cổng bằng netcat:

nc -l 8099

Sau đó, sửa đổi dịch vụ của bạn để gọi bất cứ điều gì nó thường làm với cổng đó, ví dụ: http: // localhost: 8099 / some / sort / of / endpoint

Sau đó, dịch vụ của bạn sẽ mở kết nối và ghi dữ liệu, nhưng sẽ không bao giờ nhận được phản hồi và do đó sẽ cung cấp cho bạn Thời gian đọc hết (thay vì từ chối kết nối)


1
Thật hữu ích vì bạn có thể thấy bất kỳ dữ liệu nào mà ứng dụng của bạn đang đẩy. Bạn có thể kiểm tra nếu ứng dụng của bạn đang yêu cầu trả lời.
Paul

Điều này đúng cho việc điều hướng đến một số loại điểm cuối, như đã đề cập, nhưng nếu tôi cố gắng kết nối theo cách khác, nó sẽ nhanh chóng từ chối kết nối, đó không phải là hành vi tôi đang cố gắng chế giễu ngay bây giờ.
AlanSE

@AlanSE - bạn có ý nghĩa gì khác? Bạn có thể có bất cứ điều gì sau số cổng; netcat sẽ không quan tâm vì nó không có gì để xử lý bất kỳ URL nào
Tom Chamberlain

@TomChamberlain Đợi đã, tôi có thể biết mình đã làm gì sai. Tôi đang cố gắng mô phỏng thời gian chờ kết nối ssh. Vì vậy, tôi đang cung cấp cho nó localhost, cổng 8099, nhưng trước đây tôi đã không cung cấp tên người dùng, vì vậy nếu tôi chỉ đặt một cái gì đó ssh alanse@localhost -p 8099, có vẻ như nó sẽ làm điều đó.
AlanSE

7
Để kiểm tra thời gian chờ kết nối ở cấp ổ cắm, hãy đóng băng quy trình nc bằng kill -STOP <pid>(hoặc chỉ CTRL-Z mà không đặt nền). Hệ thống sẽ hoạt động như thể máy chủ đang chạy, nhưng đợi máy chủ chấp nhận kết nối, dẫn đến thời gian chờ kết nối (errno 110).
philant

27

URL sau luôn luôn có thời gian chờ và kết hợp tốt nhất các câu trả lời của @Alexander và @ Emu ở trên:

http://example.com:81

Việc sử dụng example.com:81là một cải tiến đối với câu trả lời của Alexandre vì example.com được bảo lưu theo tiêu chuẩn DNS, do đó, nó sẽ luôn không thể truy cập được, không giống như google.com:81, điều này có thể thay đổi nếu Google cảm thấy như vậy. Ngoài ra, vì example.comđược xác định là không thể truy cập, bạn sẽ không làm ngập máy chủ của Google.

Tôi muốn nói rằng đó là một cải tiến so với câu trả lời của @ emu vì nó dễ nhớ hơn rất nhiều.


2
hiện tại tôi thấy example.comviệc giải quyết đến 93.184.216.34 và thực sự phục vụ một HTML ngắn giải thích đó là một miền mẫu ... cổng 81 vẫn không phản hồi.
Beni Cherniavsky-Paskin

Câu hỏi thực sự là liệu example.com có ​​được sử dụng theo cách đó hay không. Chỉ khi họ chính thức miễn phí tràn ngập các gói thử nghiệm thì miền này mới tốt hơn bất kỳ miền thương mại nào khác. Sử dụng các tên miền cho mục đích như vậy mà không có sự cho phép là phi đạo đức, để nói rằng, ít nhất, nếu không phải là bất hợp pháp, bởi vì nó gây tốn kém cho ai đó để xử lý các gói này. Cân nhắc sử dụng httpstat.usnhư @AndyTheEntity đã chỉ ra trong câu trả lời của anh ấy.
Manuel

@Manuel Bạn đang thiếu điểm ... example.comkhông phải là một tên miền thương mại, đó là một trong số ít các tên miền được chỉ định rõ ràng là không thể sử dụng được. Không ai có thể sở hữu example.comvà bộ định tuyến DNS biết rằng nó không bao giờ định tuyến đến một địa chỉ thực. Vì vậy, nó không làm mất thời gian của máy chủ, không có gì sai khi sử dụng nó
speedplane

@speedplane IANA sở hữu tên miền theo quy định và duy trì một máy chủ web cung cấp một trang web giải thích mục đích của example.com. Có cơ sở hạ tầng đằng sau tên miền, do đó, mọi yêu cầu đều phải trả tiền cho IANA. Việc sử dụng được phép được tham chiếu trong RFC 2606 và RFC 6761, bạn không được tự do sử dụng các tên miền cho bất kỳ mục đích nào bạn thích, như floddingchúng thay vì máy chủ khác, như bạn đề cập. Yêu cầu của bạn example.com is defined to be unreachablelà không chính xác, nó có thể đạt được. Cổng 81 hiện không thể truy cập được, nhưng nơi nào được xác định sẽ được đảm bảo trong tương lai?
Manuel

RFC mà bạn trỏ đến đặc biệt cho phép thử nghiệm DNS. Họ khuyên bạn nên sử dụng .testtên miền cấp cao hơn là example.com, nhưng những tên miền này được thiết lập rõ ràng cho mục đích này. Vâng, nó có thể tiêu tốn của IANA một chút tiền, nhưng đây là một dịch vụ mà họ cung cấp. Phí DNS của chúng tôi đang trả tiền cho nó.
siêu tốc

23

Rất nhiều câu trả lời hay nhưng giải pháp sạch nhất dường như là dịch vụ này

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

Bạn có thể định cấu hình thời lượng chờ (tối đa 230 giây) và mã trả lại cuối cùng.


16

Bạn có thể sử dụng REPL của Python để mô phỏng thời gian chờ trong khi nhận dữ liệu (nghĩa là sau khi kết nối được thiết lập thành công). Không có gì ngoài cài đặt Python tiêu chuẩn là cần thiết.

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()

Bây giờ nó chờ kết nối đến. Kết nối bất cứ điều gì bạn muốn kiểm tra localhost:9000. Khi bạn làm như vậy, Python sẽ chấp nhận kết nối và accept()sẽ trả lại nó. Trừ khi bạn gửi bất kỳ dữ liệu nào qua clientsocket, ổ cắm của người gọi sẽ hết thời gian trong thời gian tiếp theo recv().


Không làm việc cho tôi; thiếu một cái gì đó Có lẽ s.listen(5)trước đây s.accept()?
bmaupin

@bmaupin Nghe có vẻ hợp lý, tôi đoán là tôi đã quên điều đó. Đã chỉnh sửa ngay bây giờ (tuy nhiên với hàng tồn đọng là 0), cảm ơn!
Henrik Heimbuerger

1
Tôi đã có thể đặt các phần nghe và chấp nhận trong một while True:vòng lặp, và điều đó dường như tạo ra một điểm đến hết thời gian bền đẹp để đạt được để thử nghiệm.
AlanSE

2
Nó hoạt động, nhưng nó mang lại cho lỗi "thời gian chờ đọc", mà không phải là giống như "thời gian chờ kết nối"
timur

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

Tất cả những điều này là không thể định tuyến.


2
(Như tôi đã nhận xét về câu trả lời được chấp nhận) Khi tôi kiểm tra XMLHttpRequest trong Node.js, các kết nối đến 10.0.0.010.255.255.255đưa ra lỗi EACCES thay vì hết thời gian. 10.255.255.1, 172.16.0.0, 172.31.255.255, 192.168.0.0, Và 192.168.255.255đã làm thời gian chờ, tuy nhiên.
Jamie Birch

9

Tôi muốn hướng sự chú ý của mọi người đến con đường

Với một cấu hình (lấy từ ví dụ của họ), 200:b@100:drbạn sẽ có được kết nối ngẫu nhiên.


1
Không giống như thời gian chờ
nha sĩ

8

Làm thế nào về một giải pháp phần mềm:

Cài đặt máy chủ SSH trên máy chủ ứng dụng. Sau đó, sử dụng đường hầm ổ cắm để tạo liên kết giữa cổng cục bộ của bạn và cổng từ xa trên máy chủ ứng dụng. Bạn có thể sử dụng các công cụ máy khách ssh để làm như vậy. Thay vào đó, ứng dụng khách của bạn kết nối với cổng cục bộ được ánh xạ của bạn. Sau đó, bạn có thể phá vỡ đường hầm ổ cắm theo ý muốn để mô phỏng thời gian chờ kết nối.


4

Nếu bạn muốn sử dụng kết nối hoạt động, bạn cũng có thể sử dụng http://httpbin.org/delay/# , trong đó # là thời gian bạn muốn máy chủ của họ chờ trước khi gửi phản hồi. Miễn là thời gian chờ của bạn ngắn hơn thời gian trễ ... sẽ mô phỏng hiệu ứng. Tôi đã sử dụng thành công với gói yêu cầu python.

Bạn có thể muốn sửa đổi yêu cầu của mình nếu bạn gửi bất cứ điều gì nhạy cảm - không biết điều gì xảy ra với dữ liệu được gửi cho họ.


Tối đa 10 giây mặc dù (Nếu bạn đặt số cao hơn, nó sẽ phản hồi sau 10 giây)
Harry Wood

2

Có những dịch vụ có sẵn cho phép bạn tạo thời gian chờ gốc một cách giả tạo bằng cách gọi API nơi bạn chỉ định thời gian máy chủ sẽ phản hồi. Thời gian chờ máy chủ trên macgyver là một ví dụ về dịch vụ như vậy.

Ví dụ: nếu bạn muốn kiểm tra một yêu cầu mất 15 giây để trả lời, bạn chỉ cần thực hiện một yêu cầu bài đăng lên API macgyver.

Tải trọng JSON:

{
    "timeout_length": 15000
}

Phản hồi API (Sau 15 giây):

{
    "response": "ok"
}

Chương trình hết thời gian máy chủ trên macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u


1

Bạn có thể cài đặt trình điều khiển Microsoft Loopback sẽ tạo giao diện riêng cho bạn. Sau đó, bạn có thể kết nối trên đó với một số dịch vụ của bạn (máy chủ của riêng bạn). Sau đó, trong Kết nối mạng, bạn có thể tắt / bật giao diện đó ...


1

Mặc dù OP không muốn kiểm tra xem ai muốn kiểm tra: có một sự khác biệt giữa việc thử kết nối với máy chủ / cổng không tồn tại và thời gian chờ kết nối đã được thiết lập. Tôi sẽ đi với Rob và đợi cho đến khi kết nối hoạt động và sau đó kéo cáp. Hoặc - để thuận tiện - có một máy ảo hoạt động như máy chủ thử nghiệm (với mạng được bắc cầu) và chỉ cần hủy kích hoạt giao diện mạng ảo sau khi kết nối được thiết lập.


1

Kỹ thuật tôi sử dụng thường xuyên để mô phỏng thời gian chờ kết nối ngẫu nhiên là sử dụng chuyển tiếp cổng cục bộ ssh.

ssh -L 12345:realserver.com:80 localhost

Điều này sẽ chuyển tiếp lưu lượng truy cập trên localhost: 12345 đến realserver.com:80 Bạn cũng có thể lặp lại điều này trong máy cục bộ của riêng mình, nếu bạn muốn:

ssh -L 12345:localhost:8080 localhost

Vì vậy, bạn có thể trỏ ứng dụng của mình vào localhost và cổng tùy chỉnh và lưu lượng sẽ được chuyển đến máy chủ đích: cổng. Sau đó, bạn có thể thoát khỏi shell này (bạn cũng có thể cần ctrl + c shell sau khi thoát) và nó sẽ giết chuyển tiếp khiến ứng dụng của bạn bị mất kết nối.


0

Cắm cáp mạng của bạn vào một công tắc không có kết nối / cáp khác. Điều đó nên làm việc imho.


0

Có một vài chiến thuật tôi đã sử dụng trong quá khứ để mô phỏng các vấn đề về mạng;

  1. Rút cáp mạng
  2. Tắt công tắc (lý tưởng nhất là với công tắc mà máy tính đang cắm vẫn đang được cấp nguồn để máy duy trì "kết nối mạng") giữa máy của bạn và máy "đích"
  3. Chạy phần mềm tường lửa trên máy mục tiêu mà âm thầm làm rơi dữ liệu đã nhận

Một trong những ý tưởng này có thể cung cấp cho bạn một số phương tiện tạo ra kịch bản bạn cần


0

Tùy thuộc vào phần mềm tường lửa nào bạn đã cài đặt / khả dụng, bạn sẽ có thể chặn cổng gửi đi và tùy thuộc vào cách tường lửa của bạn được thiết lập, chỉ cần bỏ gói yêu cầu kết nối. Không có yêu cầu kết nối, không có kết nối, thời gian chờ xảy ra. Điều này có thể sẽ hoạt động tốt hơn nếu nó được triển khai ở cấp bộ định tuyến (chúng có xu hướng bỏ các gói thay vì gửi lại hoặc bất cứ điều gì tương đương với tình huống này) nhưng chắc chắn đó cũng là một gói phần mềm cũng thực hiện thủ thuật này.


0

Cách dễ nhất là bỏ kết nối của bạn bằng CurrPorts .

Tuy nhiên, để kiểm tra đơn vị mã xử lý ngoại lệ của bạn, có lẽ bạn nên xem xét trừu tượng hóa mã kết nối mạng của mình và viết sơ khai, giả hoặc trang trí để đưa ra các ngoại lệ theo yêu cầu. Sau đó, bạn sẽ có thể kiểm tra logic xử lý lỗi ứng dụng mà không cần phải thực sự sử dụng mạng.


Với CurrPorts, tôi dường như chỉ có thể đóng kết nối (điều này khiến cho lần tiếp theo recv()bị hỏng ngay lập tức), nhưng không thể tìm cách mô phỏng thời gian chờ (nghĩa là không có thêm dữ liệu nào được chuyển, nhưng kết nối vẫn mở).
Henrik Heimbuerger

Tôi đánh giá cao câu trả lời này vì đã đề xuất một bài kiểm tra đơn vị giả định ngoại lệ kết nối theo yêu cầu.
Daniel Bullis

0

Tôi đã có vấn đề dọc theo cùng một dòng bạn làm. Để kiểm tra hành vi phần mềm, tôi chỉ cần rút cáp mạng vào thời điểm thích hợp. Tôi phải đặt điểm dừng ngay trước khi tôi muốn rút cáp.

Nếu tôi đang làm lại, tôi sẽ đặt một công tắc (một nút ấn tạm thời thường đóng) trong cáp mạng.

Nếu ngắt kết nối vật lý gây ra một hành vi khác, bạn có thể kết nối máy tính của mình với một trung tâm giá rẻ và đặt công tắc tôi đã đề cập ở trên giữa trung tâm của bạn và mạng chính.

- EDIT - Trong nhiều trường hợp, bạn sẽ cần kết nối mạng hoạt động cho đến khi bạn đến một điểm nhất định trong chương trình của mình, THÌ bạn sẽ muốn ngắt kết nối bằng một trong nhiều đề xuất được cung cấp.


0

Đối với tôi cách dễ nhất là thêm tuyến tĩnh trên bộ định tuyến văn phòng dựa trên mạng đích. Chỉ cần định tuyến lưu lượng truy cập đến một số máy chủ không phản hồi (ví dụ: máy tính của bạn) và bạn sẽ nhận được thời gian chờ yêu cầu.

Điều tốt nhất cho tôi là tuyến tĩnh có thể được quản lý qua giao diện web và được bật / tắt dễ dàng.


-1

Bạn có thể thử kết nối với một trong những trang Web nổi tiếng trên một cổng có thể không có sẵn từ bên ngoài - 200 chẳng hạn. Hầu hết các tường lửa hoạt động ở chế độ DROP và nó sẽ mô phỏng thời gian chờ cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.