Saya sedang mengembangkan sebuah aplikasi yang mendengarkan pada port 3000. Rupanya ada sebuah instance dari itu masih mendengarkan port karena setiap kali saya memulainya, ia tidak dapat membuat pendengar (C #, TcpListener, tapi itu tidak relevan) karena port tersebut sudah diambil.
Sekarang, aplikasi tidak ada di Task Manager, jadi saya mencoba mencari PID-nya dan membunuhnya, yang menyebabkan hasil yang menarik ini:
C:\Users\username>netstat -o -n -a | findstr 0.0:3000
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 3116
C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.
Saya belum pernah melihat perilaku ini sebelumnya dan menganggapnya cukup menarik untuk melihat apakah ada yang punya solusi.
UPDATE: Saya memulai Process Explorer dan mencari 3000 dan menemukan ini:
<Non-existent Process>(3000): 5552
Saya mengkliknya dan memilih "Tutup Pegangan". Tidak lagi di Process Explorer, tetapi masih muncul di netstat dan masih menghentikan aplikasi dari memulai pendengar.
UPDATE 2: Ditemukan TCPView untuk Windows yang menunjukkan proses sebagai "<non-existent>"
. Seperti dengan CurrPorts, tidak ada yang terjadi ketika saya mencoba untuk menutup koneksi di alat ini.
Jawaban:
Untuk menghindari menunggu tanpa akhir pada soket, program Anda harus menggunakan fungsi setsockopt dengan parameter SO_REUSEADDR dan SO_RCVTIMEO:
sumber
Kami memiliki masalah yang sama dan menggunakan Process Explorer dari Microsoft Sysinternals untuk mencari ID proses yang tidak lagi ada.
Ternyata proses itu dirujuk oleh beberapa proses DrWatson. Membunuh proses-proses tersebut merilis port. DrWatson digunakan untuk mengirim dump memori ke Microsoft dan ini memakan waktu beberapa jam karena proses yang macet menampung beberapa puluh GB memori pada saat itu.
sumber
Saya pikir Anda harus mencoba CurrPorts
sumber
Masalah yang mungkin terjadi adalah bahwa proses Anda telah memulai proses (anak) lain yang mewarisi pegangan soket, dan masih berjalan.
Ada berbagai cara untuk mencegah hal ini, misalnya: ProcessStartInfo.UseShellExecute = true;
sumber
subprocess.call(..., cwd=..., shell=True)
sebagai peluncur aplikasi di server web python, dan ternyata saya harus membunuh semua proses anak untuk membebaskan soket. Yang aneh adalah saya menggunakan shell = True. Ini membuat saya kesal selama bertahun-tahun.Bisakah Anda melihat proses di Process Explorer ? Jika ya daripada Anda dapat membunuhnya dari sana, tetapi hanya setelah Anda menyelidiki apa itu sebenarnya (Anda dapat melihat semua dll dimuat ke dalam proses)
sumber
Cobalah melemparkan bendera '-b' pada perintah netstat Anda. Ini akan memberi tahu Anda nama executable yang menggunakan port. Kemudian temukan proc itu di task manager dan bunuh di sana. Jika itu tidak berhasil, posting apa yang dapat dieksekusi yang membuat port terbuka.
sumber
Perlu menyebutkan istilah berlama-lama di sini.
Detail dapat ditemukan di http://msdn.microsoft.com/en-us/library/ms739165.aspx
Singkatnya: Ada opsi yang memberi tahu sistem soket untuk menjaga soket tetap terbuka bahkan setelah ditutup jika data yang tidak terkirim ada.
Dalam aplikasi C # Anda, Anda dapat menentukan opsi terkait melalui Socket.SetSocketOption: http://msdn.microsoft.com/en-us/library/1011kecd.aspx
Karena semua hal yang disebutkan terkait dengan pengiriman dan klien, tetapi kami memiliki masalah serupa di tempat kerja, beberapa pencarian lebih lanjut senang bahwa seseorang dapat menentukan opsi berlama-lama untuk pendengar seperti yang ditunjukkan dalam contoh di sini: http://msdn.microsoft.com /library/system.net.sockets.tcplistener.server.aspx
Beberapa rekan berbicara tentang port yang ditahan oleh OS setelah aplikasi penghentian / penutupan selama sekitar dua menit. Karena itu, akan menarik untuk mendengar apakah pelabuhan masih ditahan setelah waktu tertentu.
sumber
Saya juga mengalami masalah ini. Akhirnya saya menemukan alasan saya. Ini disebabkan oleh proses utama yang memanggil proses anak oleh popen di c / c ++. Tetapi proses utama crash / shutdown sebelum memanggil pclose. Kemudian pelabuhan akan memperlakukan proses utama masih hidup dan masih mendengarkannya.
sumber
Saya punya masalah yang sama dengan xdebug, port kiri 9000 terbuka.
Saya berhasil menutup dengan cmd menggunakan "taskkill / pid xxxx".
Pid dari proses menggunakan port dapat diambil dengan "netstat -o".
Konfigurasi saya adalah memenangkan 7 home premium.
sumber
Saya memiliki masalah yang sama dan memperbaikinya dengan:
netstat -o
Menarik untuk dicatat bahwa netstat terkadang dapat mengembalikan pid tetapi bukan nama yang dapat dieksekusi yang sesuai!
sumber
Masalahnya dapat disebabkan jika proses mati telah memulai satu atau lebih proses anak. Jika
digunakan untuk memulai proses anak, itu tergantung pada nilai pegangan warisan, begitu juga dengan
Windows tidak akan memblokir port jika proses induk dihentikan dan proses klien masih berjalan.
sumber
melihat masalah yang sama ketika root menyebabkan beberapa proses anak dibuat mewarisi port, proses induk terhenti, sementara proses anak masih memegang port. Resolusi adalah untuk mengidentifikasi proses anak yang masih berjalan dan menghentikannya. Dalam contoh di sini PID proses yang tidak ada adalah 7336
Untuk menghentikan proses ini:
Dan ini menyelesaikan masalah.
sumber
Saya kira Anda tidak menginstal firewall (atau mencoba tweeks jaringan Windows)?
Beberapa firewall menunjukkan perilaku semacam ini dan dapat membuat port tetap terbuka.
Jika Anda memilikinya, coba nonaktifkan lalu luncurkan program Anda dan tutup dan lihat apa yang terjadi.
sumber
Karena proses Anda terdaftar sebagai Sistem, kemungkinan besar Anda dapat membunuhnya pada prompt perintah "Sistem". Akun Sistem memiliki lebih banyak hak istimewa daripada administrator biasa.
Anda bisa mendapatkan "Sistem" cmd.exe dengan menjadwalkan tugas untuk cmd.exe (penjadwal berjalan sebagai Sistem):
Ubah waktu itu untuk sesuatu dalam waktu dekat. Pastikan juga Anda berada di konsol mesin (jika Anda berada di sesi server terminal reguler, Anda tidak akan melihat cmd.exe baru. Buat
mstsc
login ke konsol). Saya kira ada cara lain untuk melakukan itu, tetapi ini berhasil bagi saya di masa lalu.sumber
Saya punya masalah yang sama. Proses ini sedang di-debug saat crash, dan masih ada proses vsjitdebugger.exe dalam keadaan ditangguhkan yang masih ada, yang tampaknya merujuk pada proses yang sedang di-debug. Membunuh proses vsjitdebugger.exe menyelesaikan masalah.
sumber
Penggunaan Hybrid dari TCPView dan Process Explorer bekerja untuk saya;) Saya pertama kali melihat ke id proses yang menggunakan port di TCPView. Mengisolasi proses di Process Explorer dan mematikan proses menggunakan Process Explorer.
sumber