Membuat kesalahan koneksi habis secara artifisial


291

Saya memiliki bug dalam perangkat lunak kami yang terjadi ketika saya menerima batas waktu koneksi. Kesalahan ini sangat jarang (biasanya ketika koneksi saya terhenti oleh jaringan internal kami). Bagaimana saya dapat menghasilkan efek semacam ini secara buatan sehingga saya dapat menguji perangkat lunak kami?

Jika itu penting, aplikasi ini ditulis dalam C ++ / MFC menggunakan kelas CAsyncSocket.

Edit:

Saya sudah mencoba menggunakan host yang tidak ada, dan saya mendapatkan kesalahan socket:

WSAEINVAL (10022) Argumen tidak valid

Upaya saya berikutnya adalah menggunakan saran Alexander untuk menghubungkan ke port yang berbeda, misalnya 81 (pada server saya sendiri). Itu bekerja dengan baik. Persis sama dengan koneksi yang terputus (60 detik menunggu, lalu error). Terima kasih!


Hai Mark, saya mencoba solusi yang cocok untuk Anda, tetapi yang saya terima adalah # 503 (Layanan Tidak Tersedia.). Tidak boleh salah satu dari ini, # 504 (Gateway Timeout), # 599 (Kesalahan waktu koneksi jaringan), # 598 (Kesalahan waktu baca jaringan).
CoDe

Jawaban:


297

Sambungkan ke host yang ada tetapi ke port yang diblokir oleh firewall yang hanya menjatuhkan paket TCP SYN. Misalnya, www.google.com:81.


6
Jawaban ini sederhana dan berfungsi seperti jawaban @ emu di bawah ini. Saya mengerti jawaban ini tidak bermaksud menyarankan menggunakan google.com:81 tetapi intinya di sini adalah menggunakan port lain yang diblokir. Jadi, Anda selalu dapat menggunakan <your-own-ip>: <blocked-port>.
James Selvakumar

6
Kecuali jika server Anda sendiri, tidak sopan untuk memukul server lain untuk pengujian Anda. Gunakan solusi beradab seperti emu yang disebutkan di bawah ini, dengan menekan alamat IP non-routable seperti 10.255.255.1, atau mengatur server virtual Anda sendiri untuk tujuan pengujian.
zeeshan

2
Saya pikir Google mungkin telah memblokir port ini. Ketika saya menguji ini dengan Chrome, saya hanya "Server tidak tersedia." Ketika saya menggunakan trik @ emu di bawah, koneksi hang seperti yang diharapkan. Apakah saya melewatkan sesuatu?
entpnerd

OP mengatakan dia terhubung ke port 81 di servernya sendiri dan mendapat batas waktu. Itu juga berhasil bagi saya. solusi emu memberi saya UnknownHostException di Android.
Barry Fruitman

2
Ini akan memberikan koneksi ditolak bukan batas waktu.
Mehdi

425

Sambungkan ke alamat IP yang tidak dapat dirute, seperti 10.255.255.1.


12
Idem, dan saya kira ini adalah jawaban yang lebih baik karena google.com:81 mungkin bisa dijangkau suatu hari.
Gui13

138
... dan karena mengirim paket acak ke server orang lain dari pengujian unit Anda tidak sopan.
Glenn Maynard

15
Ini tidak akan selalu berhasil. Misalnya, dengan Python urllib, ini akan mengembalikan pengecualian 'Tidak ada rute ke host'. 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 semua ini tidak dapat dialihkan.
rajesh_kw

4
Kesalahan "No route to host" yang disebutkan oleh @FHI umumnya muncul dalam dua kondisi: (a) saat Anda mencoba menyambungkan ke host yang tidak dapat dijangkau di LAN lokal Anda (artinya, itu tidak menjawab pertanyaan ARP jadi itu pada dasarnya adalah " Batas waktu ARP "). Dan (b) saat router mengembalikan kesalahan ICMP yang sesuai. Kasus pertama terjadi jika Anda berada di subnet yang sama dengan IP pribadi yang Anda uji. Kasus kedua jika router tidak tahu cara merutekan paket Anda ke tujuannya, tetapi dalam beberapa kasus mereka hanya menjatuhkan paket tanpa mengirim kesalahan ICMP.
Ale

47

Jika Anda menggunakan mesin unix, Anda dapat memulai mendengarkan port menggunakan netcat:

nc -l 8099

Kemudian, modifikasi layanan Anda untuk memanggil apa pun yang biasanya dilakukan untuk port itu misalnya http: // localhost: 8099 / some / sort / of / endpoint

Kemudian, layanan Anda akan membuka koneksi dan menulis data, tetapi tidak akan pernah mendapatkan respons, dan dengan demikian akan memberi Anda Waktu Baca Habis (daripada Koneksi Ditolak)


1
Ini berguna karena Anda dapat melihat data apa pun yang didorong oleh aplikasi Anda. Anda dapat memeriksa apakah aplikasi Anda meminta tanggapan.
Paul

Ini berlaku untuk menavigasi ke semacam titik akhir, seperti yang disebutkan, tetapi jika saya mencoba menghubungkan beberapa cara lain dengan cepat memberikan koneksi ditolak, yang bukan perilaku yang saya coba mengejek sekarang.
AlanSE

@AlanSE - apa cara lain yang Anda maksud? Anda dapat memiliki apa pun setelah nomor port; netcat tidak akan peduli karena tidak ada yang menangani URL apa pun
Tom Chamberlain

@ TomChamberlain Oh, tunggu, saya mungkin tahu apa yang saya lakukan salah. Saya mencoba mensimulasikan waktu habis koneksi ssh. Jadi saya memberikannya localhost, port 8099, tetapi sebelumnya saya tidak memberikan nama pengguna, jadi jika saya hanya memasukkan sesuatu ssh alanse@localhost -p 8099, sepertinya itu yang melakukannya.
AlanSE

7
Untuk menguji batas waktu koneksi pada level soket, bekukan proses nc dengan kill -STOP <pid>(atau cukup CTRL-Z tanpa meletakkannya di latar belakang). Sistem akan bertindak seolah-olah server sedang berjalan, tetapi tunggu server untuk menerima koneksi, menghasilkan waktu habis koneksi (errno 110).
Filantir

27

URL berikut selalu memberikan batas waktu, dan menggabungkan jawaban @Alexander dan @ Emu terbaik di atas:

http://example.com:81

Penggunaan example.com:81adalah peningkatan pada jawaban Alexander karena example.com dicadangkan oleh standar DNS, jadi itu akan selalu tidak terjangkau, tidak seperti google.com:81, yang dapat berubah jika Google menginginkannya. Juga, karena example.comdidefinisikan tidak dapat dijangkau, Anda tidak akan membanjiri server Google.

Saya akan mengatakan ini merupakan peningkatan dari jawaban @ emu karena jauh lebih mudah untuk diingat.


2
Saat ini saya melihat example.compenyelesaian ke 93.184.216.34, dan benar-benar menyajikan HTML singkat yang menjelaskan itu adalah contoh domain ... port 81 masih tidak merespons.
Beni Cherniavsky-Paskin

Pertanyaannya sebenarnya adalah apakah example.com seharusnya digunakan dengan cara itu. Hanya jika mereka membuatnya secara resmi bebas dibanjiri dengan paket uji, maka domain ini lebih baik daripada domain komersial lainnya. Menggunakan domain untuk tujuan seperti itu tanpa izin adalah tidak etis, untuk sedikitnya, jika tidak ilegal, karena itu memerlukan biaya seseorang untuk menangani paket-paket ini. Pertimbangkan untuk menggunakan httpstat.usseperti yang ditunjukkan oleh @AndyTheEntity dalam jawabannya.
Manuel

@Manuel Anda melewatkan intinya ... example.combukan domain komersial, itu salah satu dari beberapa nama domain yang secara eksplisit ditentukan tidak dapat digunakan. Tidak ada yang bisa memiliki example.comdan router DNS tahu bahwa itu tidak pernah merutekan ke alamat asli. Jadi tidak ada biaya waktu server siapa pun, tidak ada yang salah dengan menggunakannya
speedplane

@speedplane IANA memiliki domain berdasarkan peraturan dan mengelola server web yang menyediakan halaman web yang menjelaskan tujuan example.com. Ada infrastruktur di belakang domain, maka setiap permintaan itu adalah biaya uang IANA. Penggunaan yang diizinkan direferensikan dalam RFC 2606 dan RFC 6761, Anda tidak bebas menggunakan domain untuk tujuan apa pun yang Anda suka, seperti floddingmereka alih-alih server lain, seperti yang Anda sebutkan. Klaim Anda yang example.com is defined to be unreachablesalah, bisa dijangkau. Port 81 tidak dapat dijangkau sekarang, tetapi di mana itu didefinisikan untuk dijamin di masa depan?
Manuel

RFC yang Anda tunjuk secara khusus memungkinkan untuk pengujian DNS. Mereka menyarankan Anda menggunakan .testdomain tingkat atas, bukan example.com, tetapi domain ini jelas disiapkan untuk tujuan ini. Ya, itu mungkin menghabiskan sedikit uang untuk IANA, tetapi ini adalah layanan yang mereka berikan. Biaya DNS kami membayar untuk itu.
speedplane

23

Banyak jawaban bagus tetapi solusi terbersih tampaknya adalah layanan ini

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

Anda dapat mengkonfigurasi durasi batas waktu (hingga 230 detik) dan kode pengembalian akhirnya.


16

Anda dapat menggunakan Python REPL untuk mensimulasikan batas waktu saat menerima data (yaitu setelah koneksi berhasil dibuat). Hanya diperlukan instalasi Python standar.

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

Sekarang menunggu koneksi masuk. Hubungkan apa pun yang ingin Anda uji localhost:9000. Ketika Anda melakukannya, Python akan menerima koneksi dan accept()akan mengembalikannya. Kecuali jika Anda mengirim data apa pun melalui clientsocketsoket, pemanggil harus kehabisan waktu selama berikutnya recv().


Tidak bekerja untuk saya; Ada yang hilang. Mungkin s.listen(5)sebelumnya s.accept()?
bmaupin

@ Bupupin Kedengarannya masuk akal, saya kira saya hanya lupa itu. Diedit sekarang (namun dengan antrian backlog 0), terima kasih!
Henrik Heimbuerger

1
Saya dapat menempatkan bagian mendengarkan dan menerima dalam satu while True:lingkaran, dan itu tampaknya menjadi tujuan jangka waktu tunggu yang bagus dan tahan lama untuk diuji.
AlanSE

2
Berhasil, tetapi memberikan kesalahan "baca batas waktu", yang tidak sama dengan "batas waktu koneksi"
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

Semua ini tidak dapat dirute.


2
(Seperti yang saya komentari pada jawaban yang diterima) Ketika saya menguji XMLHttpRequest di Node.js, koneksi ke 10.0.0.0dan 10.255.255.255menembakkan kesalahan EACCES daripada waktu habis. 10.255.255.1, 172.16.0.0, 172.31.255.255, 192.168.0.0, Dan 192.168.255.255melakukan timeout, namun.
Jamie Birch

9

Saya ingin mengarahkan perhatian semua orang ke pathod

Dengan konfigurasi (diambil dari contohnya) 200:b@100:drAnda akan mendapatkan koneksi yang turun secara acak.


1
Tidak sama dengan timeout
dentarg

8

Bagaimana dengan solusi perangkat lunak:

Instal SSH server di server aplikasi. Kemudian, gunakan terowongan soket untuk membuat tautan antara port lokal Anda dan port jarak jauh pada server aplikasi. Anda dapat menggunakan alat klien ssh untuk melakukannya. Minta aplikasi klien Anda terhubung ke port lokal yang dipetakan. Kemudian, Anda dapat mematahkan terowongan soket sesuka hati untuk mensimulasikan batas waktu koneksi.


4

Jika Anda ingin menggunakan koneksi aktif, Anda juga dapat menggunakan http://httpbin.org/delay/# , di mana # adalah saat Anda ingin server mereka menunggu sebelum mengirim respons. Selama batas waktu Anda lebih pendek daripada penundaan ... Anda harus mensimulasikan efeknya. Saya telah berhasil menggunakannya dengan paket permintaan python.

Anda mungkin ingin mengubah permintaan Anda jika Anda mengirim sesuatu yang sensitif - tidak tahu apa yang terjadi pada data yang dikirim kepada mereka.


Maks 10 detik (Jika Anda memasukkan angka yang lebih tinggi itu akan merespons setelah 10 detik)
Harry Wood

2

Ada layanan yang tersedia yang memungkinkan Anda untuk membuat batas waktu asal secara artifisial dengan memanggil API tempat Anda menentukan berapa lama server akan merespons. Timeout Server pada macgyver adalah contoh dari layanan seperti itu.

Misalnya, jika Anda ingin menguji permintaan yang membutuhkan waktu 15 detik untuk merespons, Anda cukup membuat permintaan posting ke API macgyver.

Payload JSON:

{
    "timeout_length": 15000
}

Respons API (Setelah 15 detik):

{
    "response": "ok"
}

Program Timeout Server pada macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u


1

Anda dapat menginstal driver Microsoft Loopback yang akan membuat antarmuka terpisah untuk Anda. Kemudian Anda dapat menghubungkannya ke beberapa layanan milik Anda (host Anda sendiri). Kemudian di Network Connections Anda dapat menonaktifkan / mengaktifkan antarmuka seperti itu ...


1

Meskipun tidak sepenuhnya jelas yang mana yang ingin diuji oleh OP: ada perbedaan antara mencoba koneksi ke host / port yang tidak ada dan batas waktu koneksi yang sudah ada. Saya akan pergi dengan Rob dan menunggu sampai koneksi berfungsi dan kemudian tarik kabelnya. Atau - untuk kenyamanan - miliki mesin virtual yang berfungsi sebagai server uji (dengan jaringan yang dijembatani) dan cukup nonaktifkan antarmuka jaringan virtual setelah koneksi dibuat.


1

Teknik yang sering saya gunakan untuk mensimulasikan batas waktu koneksi acak adalah dengan menggunakan penerusan port lokal ssh.

ssh -L 12345:realserver.com:80 localhost

Ini akan meneruskan lalu lintas di localhost: 12345 ke realserver.com:80 Anda juga dapat memutarnya di mesin lokal Anda sendiri, jika Anda mau:

ssh -L 12345:localhost:8080 localhost

Jadi Anda bisa mengarahkan aplikasi Anda ke localhost dan port khusus Anda, dan lalu lintas akan dialihkan ke host target: port. Kemudian Anda dapat keluar dari shell ini (Anda mungkin juga perlu ctrl + c shell setelah Anda keluar) dan itu akan membunuh penerusan yang menyebabkan aplikasi Anda melihat kehilangan koneksi.


0

Sambungkan kabel jaringan Anda ke sakelar yang tidak memiliki koneksi / kabel lain. Itu seharusnya bekerja dengan baik.


0

Ada beberapa taktik yang saya gunakan di masa lalu untuk mensimulasikan masalah jaringan;

  1. Cabut kabel jaringan
  2. Matikan sakelar (idealnya dengan sakelar yang digunakan komputer untuk tetap terhubung sehingga mesin mempertahankan "koneksi jaringan") antara mesin Anda dan mesin "target"
  3. Jalankan perangkat lunak firewall pada mesin target yang secara diam-diam menjatuhkan data yang diterima

Salah satu ide ini mungkin memberi Anda beberapa cara untuk secara buatan menghasilkan skenario yang Anda butuhkan


0

Bergantung pada perangkat lunak firewall apa yang telah Anda instal / tersedia, Anda harus dapat memblokir port keluar dan tergantung pada bagaimana firewall Anda mengaturnya, ia hanya harus menjatuhkan paket permintaan koneksi. Tidak ada permintaan koneksi, tidak ada koneksi, waktu habis terjadi. Ini mungkin akan bekerja lebih baik jika diimplementasikan pada tingkat router (mereka cenderung menjatuhkan paket daripada mengirim ulang, atau apa pun yang setara untuk situasi ini) tetapi pasti ada paket perangkat lunak yang akan melakukan trik juga.


0

Cara termudah adalah dengan menjatuhkan koneksi Anda menggunakan CurrPorts .

Namun, untuk menguji unit Anda menangani kode pengecualian, mungkin Anda harus mempertimbangkan abstrak kode koneksi jaringan Anda, dan menulis rintisan, tiruan atau dekorator yang melempar pengecualian pada permintaan. Anda kemudian dapat menguji logika penanganan kesalahan aplikasi tanpa harus benar-benar menggunakan jaringan.


Dengan CurrPorts, saya tampaknya hanya dapat menutup koneksi (yang menyebabkan recv()kegagalan berikutnya segera), tetapi tidak dapat menemukan cara untuk mensimulasikan batas waktu (yaitu tidak ada lagi data yang ditransfer, tetapi koneksi tetap terbuka).
Henrik Heimbuerger

Saya menghargai jawaban ini karena menyarankan unit test yang mengejek pengecualian koneksi pada permintaan.
Danny Bullis

0

Saya memiliki masalah di sepanjang baris yang sama yang Anda lakukan. Untuk menguji perilaku perangkat lunak, saya hanya mencabut kabel jaringan pada waktu yang tepat. Saya harus mengatur break-point tepat sebelum saya ingin mencabut kabel.

Jika saya melakukannya lagi, saya akan meletakkan saklar (tombol tekan sesaat yang biasanya tertutup) pada kabel jaringan.

Jika pemutusan fisik menyebabkan perilaku yang berbeda, Anda dapat menghubungkan komputer Anda ke hub murah dan meletakkan saklar yang saya sebutkan di atas antara hub Anda dan jaringan utama.

- EDIT - Dalam banyak kasus Anda akan memerlukan koneksi jaringan berfungsi sampai Anda mencapai titik tertentu dalam program Anda, MAKA Anda ingin memutuskan koneksi menggunakan salah satu dari banyak saran yang ditawarkan.


0

Bagi saya cara termudah adalah menambahkan rute statis pada router kantor berdasarkan jaringan tujuan. Arahkan lalu lintas ke beberapa host yang tidak responsif (mis. Komputer Anda) dan Anda akan mendapatkan batas waktu permintaan.

Hal terbaik bagi saya adalah rute statis dapat dikelola melalui antarmuka web dan diaktifkan / dinonaktifkan dengan mudah.


-1

Anda dapat mencoba menyambung ke salah satu situs Web terkenal di port yang mungkin tidak tersedia dari luar - misalnya 200. Sebagian besar firewall bekerja dalam mode DROP dan itu akan mensimulasikan batas waktu untuk Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.