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!
sumber
Jawaban:
Sambungkan ke host yang ada tetapi ke port yang diblokir oleh firewall yang hanya menjatuhkan paket TCP SYN. Misalnya, www.google.com:81.
sumber
Sambungkan ke alamat IP yang tidak dapat dirute, seperti 10.255.255.1.
sumber
urllib
, ini akan mengembalikan pengecualian 'Tidak ada rute ke host'. FYIJika Anda menggunakan mesin unix, Anda dapat memulai mendengarkan port menggunakan netcat:
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)
sumber
ssh alanse@localhost -p 8099
, sepertinya itu yang melakukannya.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).URL berikut selalu memberikan batas waktu, dan menggabungkan jawaban @Alexander dan @ Emu terbaik di atas:
http://example.com:81
Penggunaan
example.com:81
adalah peningkatan pada jawaban Alexander karena example.com dicadangkan oleh standar DNS, jadi itu akan selalu tidak terjangkau, tidak sepertigoogle.com:81
, yang dapat berubah jika Google menginginkannya. Juga, karenaexample.com
didefinisikan tidak dapat dijangkau, Anda tidak akan membanjiri server Google.Saya akan mengatakan ini merupakan peningkatan dari jawaban @ emu karena jauh lebih mudah untuk diingat.
sumber
example.com
penyelesaian ke 93.184.216.34, dan benar-benar menyajikan HTML singkat yang menjelaskan itu adalah contoh domain ... port 81 masih tidak merespons.httpstat.us
seperti yang ditunjukkan oleh @AndyTheEntity dalam jawabannya.example.com
bukan domain komersial, itu salah satu dari beberapa nama domain yang secara eksplisit ditentukan tidak dapat digunakan. Tidak ada yang bisa memilikiexample.com
dan router DNS tahu bahwa itu tidak pernah merutekan ke alamat asli. Jadi tidak ada biaya waktu server siapa pun, tidak ada yang salah dengan menggunakannyaexample.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, sepertiflodding
mereka alih-alih server lain, seperti yang Anda sebutkan. Klaim Anda yangexample.com is defined to be unreachable
salah, bisa dijangkau. Port 81 tidak dapat dijangkau sekarang, tetapi di mana itu didefinisikan untuk dijamin di masa depan?.test
domain tingkat atas, bukanexample.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.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.
sumber
Anda dapat menggunakan Python REPL untuk mensimulasikan batas waktu saat menerima data (yaitu setelah koneksi berhasil dibuat). Hanya diperlukan instalasi Python standar.
Sekarang menunggu koneksi masuk. Hubungkan apa pun yang ingin Anda uji
localhost:9000
. Ketika Anda melakukannya, Python akan menerima koneksi danaccept()
akan mengembalikannya. Kecuali jika Anda mengirim data apa pun melaluiclientsocket
soket, pemanggil harus kehabisan waktu selama berikutnyarecv()
.sumber
s.listen(5)
sebelumnyas.accept()
?while True:
lingkaran, dan itu tampaknya menjadi tujuan jangka waktu tunggu yang bagus dan tahan lama untuk diuji.Semua ini tidak dapat dirute.
sumber
10.0.0.0
dan10.255.255.255
menembakkan kesalahan EACCES daripada waktu habis.10.255.255.1
,172.16.0.0
,172.31.255.255
,192.168.0.0
, Dan192.168.255.255
melakukan timeout, namun.Saya ingin mengarahkan perhatian semua orang ke pathod
Dengan konfigurasi (diambil dari contohnya)
200:b@100:dr
Anda akan mendapatkan koneksi yang turun secara acak.sumber
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.
sumber
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.
sumber
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:
Respons API (Setelah 15 detik):
Program Timeout Server pada macgyver
https://askmacgyver.com/explore/program/server-timeout/3U4s6g6u
sumber
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 ...
sumber
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.
sumber
Teknik yang sering saya gunakan untuk mensimulasikan batas waktu koneksi acak adalah dengan menggunakan penerusan port lokal ssh.
Ini akan meneruskan lalu lintas di localhost: 12345 ke realserver.com:80 Anda juga dapat memutarnya di mesin lokal Anda sendiri, jika Anda mau:
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.
sumber
Sambungkan kabel jaringan Anda ke sakelar yang tidak memiliki koneksi / kabel lain. Itu seharusnya bekerja dengan baik.
sumber
Ada beberapa taktik yang saya gunakan di masa lalu untuk mensimulasikan masalah jaringan;
Salah satu ide ini mungkin memberi Anda beberapa cara untuk secara buatan menghasilkan skenario yang Anda butuhkan
sumber
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.
sumber
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.
sumber
recv()
kegagalan berikutnya segera), tetapi tidak dapat menemukan cara untuk mensimulasikan batas waktu (yaitu tidak ada lagi data yang ditransfer, tetapi koneksi tetap terbuka).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.
sumber
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.
sumber
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.
sumber