Pertanyaan Soket tetap terbuka setelah program ditutup (C ++)


Saat ini saya sedang menulis aplikasi server kecil, dan masalah saya adalah, bahwa ketika saya menutup aplikasi saya (atau lebih baik, tekan tombol mengakhiri dalam gerhana), soket kadang tetap terbuka, jadi ketika saya menjalankan aplikasi saya di lain waktu, ikat () akan gagal dengan "Alamat sudah digunakan". Bagaimana saya bisa menutup soket saya dengan benar ketika program itu keluar? Saya sudah menempatkan

close(mySocket);

di kelas destruktor, tetapi itu tampaknya tidak mengubah apa pun.


5
2017-08-06 20:15


asal


Jawaban:


http://hea-www.harvard.edu/~fine/Tech/addrinuse.html harus menjawab banyak pertanyaan Anda. Saya cenderung menggunakan SO_REUSEADDR untuk mengatasi masalah itu.


3
2017-08-06 20:26



Gunakan SO_REUSEADDR.


5
2017-08-06 20:24



Menggunakan netstat untuk mencari tahu apa yang menyatakan titik akhir Anda. Tebakan saya adalah bahwa itu ada di salah satu TIME_WAIT dan tidak tertutup sepenuhnya. Ini adalah perilaku yang benar untuk TCP, dan ada untuk memungkinkan segmen tersesat yang mungkin masih keluar di ether untuk tiba dan tidak menimbulkan masalah. Durasi TIME_WAIT adalah sesuatu seperti 2 * MSL, yaitu dua kali seumur hidup maksimum segmen di jaringan, sehingga memastikan bahwa bahkan segmen yang ditransmisikan akan ditangani dengan benar.

Seperti yang orang lain tunjukkan, SO_REUSEADDR adalah teman Anda selama endpoint sisi jauh berbeda setiap kali. Itu kasus umum, tetapi terkadang orang melakukan hal-hal aneh seperti mengikat klien ke port tertentu, dan dalam hal ini Anda masih akan berakhir dengan EADDRINUSE b / c TCP mendefinisikan sesi sebagai kedua titik akhir.


4
2017-08-06 21:04



Sudahkah Anda mengatur SO_REUSEADDR pilihan? Dari apa yang kamu katakan, sepertinya tidak.


2
2017-08-06 20:25



Jangan lupa untuk memeriksa kembali nilai tutup. Ini akan mengembalikan 0 ketika soket berhasil ditutup. Ini akan mengembalikan -1 jika gagal.


0
2017-08-06 22:08



Apakah Anda yakin aplikasi Anda entah bagaimana masih berjalan di latar belakang?


-1
2017-08-06 20:23