Dalam C # untuk menggunakan TcpClient atau secara umum untuk menghubungkan ke soket, bagaimana saya bisa pertama kali memeriksa apakah port tertentu gratis di mesin saya?
info lebih lanjut: Ini adalah kode yang saya gunakan:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
Jawaban:
Karena Anda menggunakan a
TcpClient
, itu berarti Anda memeriksa port TCP terbuka. Ada banyak objek bagus yang tersedia di namespace System.Net.NetworkInformation .Gunakan
IPGlobalProperties
objek tersebut untuk mendapatkan larikTcpConnectionInformation
objek, yang kemudian dapat Anda interogasi tentang IP dan port titik akhir.sumber
netstat -a -b
. Perhatikan bahwaLISTENING
koneksi tidak ada di fileGetActiveTcpConnections()
. Anda juga harus check-inSystem.Net.IPEndPoints[]
dikembalikan olehipGlobalProperties.GetActiveTcpListeners();
Anda berada di ujung Intertube yang salah. Ini adalah server yang hanya dapat membuka satu port tertentu. Beberapa kode:
Gagal dengan:
sumber
Saat Anda mengatur koneksi TCP, 4-tuple (source-ip, source-port, dest-ip, dest-port) harus unik - ini untuk memastikan paket dikirimkan ke tempat yang tepat.
Ada batasan lebih lanjut di sisi server bahwa hanya satu program server yang dapat mengikat ke nomor port masuk (dengan asumsi satu alamat IP; server multi-NIC memiliki kekuatan lain tetapi kami tidak perlu membahasnya di sini).
Jadi, di ujung server, Anda:
Di sisi klien, biasanya sedikit lebih sederhana:
Tidak ada persyaratan bahwa IP / port tujuan harus unik karena hanya akan menghasilkan satu orang pada satu waktu yang dapat menggunakan Google, dan itu akan menghancurkan model bisnis mereka.
Ini berarti Anda bahkan dapat melakukan hal-hal menakjubkan seperti FTP multi-sesi karena Anda mengatur beberapa sesi di mana satu-satunya perbedaan adalah port sumber Anda, memungkinkan Anda mengunduh potongan secara paralel. Torrent sedikit berbeda karena tujuan tiap sesi biasanya berbeda.
Dan, setelah semua omong kosong itu (maaf), jawaban atas pertanyaan spesifik Anda adalah Anda tidak perlu menentukan port gratis. Jika Anda terhubung ke server dengan panggilan yang tidak menentukan port sumber Anda, itu hampir pasti akan menggunakan nol di bawah selimut dan sistem akan memberi Anda yang tidak terpakai.
sumber
Anda telah salah paham tentang apa yang terjadi di sini.
Parameter TcpClient (...) adalah ip server dan port server yang ingin Anda sambungkan.
TcpClient memilih port lokal sementara dari pool yang tersedia untuk berkomunikasi ke server. Tidak perlu memeriksa ketersediaan porta lokal karena secara otomatis ditangani oleh lapisan winsock.
Jika Anda tidak dapat terhubung ke server menggunakan fragmen kode di atas, masalahnya mungkin satu atau lebih dari beberapa. (mis. ip dan / atau port server salah, server jarak jauh tidak tersedia, dll ..)
sumber
Terima kasih atas tip ini. Saya membutuhkan fungsionalitas yang sama tetapi di sisi Server untuk memeriksa apakah Port sedang digunakan, jadi saya memodifikasinya ke kode ini.
sumber
-anb
) dan tanpa parameter apapun itu menunjukkan koneksi Asing serta status.terima kasih atas jawabannya jro. Saya harus menyesuaikannya untuk penggunaan saya. Saya perlu memeriksa apakah port sedang didengarkan, dan tidak perlu aktif. Untuk ini saya ganti
dengan
Saya mengulang array titik akhir untuk memeriksa bahwa nilai port saya tidak ditemukan.
sumber
sumber
netstat! Itu adalah utilitas baris perintah jaringan yang dikirimkan bersama windows. Ini menunjukkan semua koneksi yang dibuat saat ini dan semua port yang saat ini sedang didengarkan. Anda dapat menggunakan program ini untuk memeriksa, tetapi jika Anda ingin melakukan ini dari kode lihat ke namespace System.Net.NetworkInformation? Ini adalah namespace baru mulai 2.0. Ada beberapa barang di sana. Tetapi pada akhirnya jika Anda ingin mendapatkan jenis informasi yang sama yang tersedia melalui perintah netstat, Anda harus menghasilkan P / Invoke ...
Pembaruan: System.Net.NetworkInformation
Namespace itu berisi sekumpulan kelas yang dapat Anda gunakan untuk mencari tahu hal-hal tentang jaringan.
Saya tidak dapat menemukan potongan kode lama itu tetapi saya pikir Anda dapat menulis sesuatu yang serupa sendiri. Awal yang baik adalah memeriksa API Pembantu IP . Google MSDN untuk fungsi GetTcpTable WINAPI dan gunakan P / Invoke untuk menghitung sampai Anda memiliki informasi yang Anda butuhkan.
sumber
Jika saya tidak terlalu salah, Anda dapat menggunakan System.Network. Apa pun untuk diperiksa.
Namun hal tersebut akan selalu menimbulkan kondisi balapan.
Cara pemeriksaan kanonik adalah mencoba mendengarkan pada port itu. Jika Anda mendapatkan kesalahan, port tidak terbuka.
Saya pikir ini adalah bagian dari mengapa bind () dan listen () adalah dua panggilan sistem yang terpisah.
sumber
Kamu bilang
Tetapi Anda selalu dapat terhubung ke port sementara orang lain menggunakannya jika ada sesuatu yang mendengarkan di sana. Jika tidak, port http 80 akan berantakan.
Jika Anda
gagal, maka tidak ada yang mendengarkan di sana. Jika tidak, itu akan terhubung, bahkan jika beberapa mesin / aplikasi lain memiliki soket yang terbuka ke ip dan port tersebut.
sumber
ipGlobalProperties.GetActiveTcpConnections()
tidak mengembalikan koneksi dalam Status Dengar.Port dapat digunakan untuk mendengarkan, tetapi tanpa ada yang terhubung dengannya, metode yang dijelaskan di atas tidak akan berfungsi.
sumber
Dari port yang tersedia saya akan mengecualikan:
Dengan impor berikut:
Anda dapat menggunakan fungsi berikut untuk memeriksa apakah port tersedia atau tidak:
Saya memberi Anda fungsi serupa untuk mereka yang menggunakan VB.NET :
sumber
Untuk menjawab pertanyaan pasti tentang menemukan port gratis (yang saya butuhkan dalam pengujian unit saya) di dotnet core 3.1, saya membuat ini
catatan: berdasarkan komentar oleh @ user207421 tentang port nol saya mencari dan menemukan ini dan sedikit memodifikasinya.
sumber
Perhatikan jendela waktu antara Anda membuat cek dan saat Anda mencoba membuat koneksi, beberapa proses mungkin memerlukan port - TOCTOU klasik . Mengapa Anda tidak mencoba terhubung saja? Jika gagal maka Anda tahu port tersebut tidak tersedia.
sumber
Anda tidak perlu mengetahui port apa yang terbuka di komputer lokal Anda untuk terhubung ke beberapa layanan TCP jarak jauh (kecuali Anda ingin menggunakan porta lokal tertentu, tetapi biasanya tidak demikian).
Setiap koneksi TCP / IP diidentifikasi oleh 4 nilai: IP jarak jauh, nomor port jarak jauh, IP lokal, nomor port lokal, tetapi Anda hanya perlu mengetahui IP jarak jauh dan nomor port jarak jauh untuk membuat sambungan.
Saat Anda membuat koneksi tcp menggunakan
Sistem Anda akan secara otomatis menetapkan salah satu dari banyak nomor porta lokal gratis ke koneksi Anda. Anda tidak perlu melakukan apapun. Anda mungkin juga ingin memeriksa apakah port jarak jauh terbuka. tetapi tidak ada cara yang lebih baik untuk melakukan itu selain mencoba menghubungkannya.
sumber
sumber
sumber
Periksa kode kesalahan 10048
sumber
coba ini, dalam kasus saya nomor port untuk objek yang dibuat tidak tersedia jadi saya datang dengan ini
sumber