Saya menjalankan server, dan saya ingin menampilkan alamat IP saya sendiri.
Apa sintaks untuk mendapatkan alamat IP komputer sendiri (jika mungkin, eksternal)?
Seseorang menulis kode berikut.
IPHostEntry host;
string localIP = "?";
host = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress ip in host.AddressList)
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
localIP = ip.ToString();
}
}
return localIP;
Namun, saya umumnya tidak percaya pada penulis, dan saya tidak mengerti kode ini. Apakah ada cara yang lebih baik untuk melakukannya?
c#
ip-address
Nefzen
sumber
sumber
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
Jawaban:
Tidak, itu cara terbaik untuk melakukannya. Karena mesin dapat memiliki beberapa alamat IP, Anda perlu mengulang koleksi mereka untuk menemukan yang benar.
Sunting: Satu-satunya hal yang akan saya ubah adalah mengubah ini:
untuk ini:
Tidak perlu
ToString
pencacahan untuk perbandingan.sumber
break
pernyataan setelah IP ditemukan untuk menghindari iterasi yang tidak perlu melalui koleksi (dalam hal ini saya ragu dampak kinerja akan menjadi masalah, tetapi saya ingin menekankan kebiasaan pengkodean yang umumnya baik)Satu-satunya cara untuk mengetahui IP publik Anda adalah dengan meminta orang lain untuk memberi tahu Anda; kode ini dapat membantu Anda:
sumber
Pembersih dan solusi menyeluruh: D
sumber
Jika Anda tidak dapat mengandalkan untuk mendapatkan alamat IP Anda dari server DNS (yang telah terjadi pada saya), Anda dapat menggunakan pendekatan berikut:
Namespace System.Net.NetworkInformation berisi kelas NetworkInterface , yang memiliki metode GetAllNetworkInterfaces statis .
Metode ini akan mengembalikan semua "antarmuka jaringan" pada mesin Anda, dan umumnya ada beberapa, bahkan jika Anda hanya memiliki adaptor nirkabel dan / atau perangkat keras adaptor ethernet yang terpasang pada mesin Anda. Semua antarmuka jaringan ini memiliki alamat IP yang valid untuk mesin lokal Anda, meskipun Anda mungkin hanya menginginkannya.
Jika Anda mencari satu alamat IP, maka Anda perlu memfilter daftar itu hingga Anda dapat mengidentifikasi alamat yang benar. Anda mungkin perlu melakukan beberapa eksperimen, tetapi saya berhasil dengan pendekatan berikut:
OperationalStatus == OperationalStatus.Up
. Ini akan mengecualikan adaptor ethernet fisik Anda, misalnya, jika Anda tidak memiliki kabel jaringan.Untuk setiap NetworkInterface, Anda bisa mendapatkan objek IPInterfaceProperties menggunakan metode GetIPProperties , dan dari objek IPInterfaceProperties Anda dapat mengakses properti UnicastAddresses untuk daftar objek UnicastIPAddressInformation .
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
AddressPreferredLifetime != UInt32.MaxValue
.Pada titik ini saya mengambil alamat dari alamat unicast pertama (jika ada) yang cocok dengan semua filter ini.
EDIT:
[kode revisi pada 16 Mei 2018 untuk memasukkan kondisi yang disebutkan dalam teks di atas untuk keadaan deteksi alamat rangkap dan masa pakai yang disukai]
Sampel di bawah ini menunjukkan penyaringan berdasarkan status operasional, keluarga alamat, tidak termasuk alamat loopback (127.0.0.1), status deteksi alamat duplikat, dan masa pakai yang disukai.
sumber
sumber
Baru saja menguji ini pada mesin saya dan berhasil.
sumber
Jika Anda ingin menghindari menggunakan DNS:
sumber
Jangan mengandalkan InterNetwork sepanjang waktu karena Anda dapat memiliki lebih dari satu perangkat yang juga menggunakan IP4 yang akan mengacaukan hasil dalam mendapatkan IP Anda. Sekarang, jika Anda ingin, Anda dapat menyalin ini dan tinjau atau perbarui sesuai keinginan Anda.
Pertama saya mendapatkan alamat router (gateway). Jika kembali bahwa saya terhubung ke gateway (yang berarti tidak terhubung langsung ke modem nirkabel atau tidak) maka kita memiliki alamat gateway kita sebagai IPAddress. .
Maka kita perlu mendapatkan daftar IPAddresses komputer. Di sinilah segalanya tidak terlalu sulit karena router (semua router) menggunakan 4 byte (...). Tiga yang pertama adalah yang paling penting karena setiap komputer yang terhubung akan memiliki alamat IP4 yang cocok dengan tiga byte pertama. Contoh: 192.168.0.1 adalah standar untuk IP default router kecuali diubah oleh administratornya. '192.168.0' atau apa pun itu, kita perlu menyesuaikannya. Dan itulah yang saya lakukan dalam fungsi IsAddressOfGateway. Alasan untuk pencocokan panjang adalah karena tidak semua alamat (yang hanya untuk komputer) memiliki panjang 4 byte. Jika Anda mengetik netstat di cmd, Anda akan menemukan ini benar. Jadi begitulah. Ya, butuh sedikit lebih banyak pekerjaan untuk benar-benar mendapatkan apa yang Anda cari. Proses eliminasi. Dan demi Tuhan, jangan menemukan alamat dengan melakukan ping yang memerlukan waktu karena pertama-tama Anda mengirim alamat untuk di-ping dan kemudian harus mengirim hasilnya kembali. Tidak, bekerja secara langsung dengan kelas .Net yang berhubungan dengan lingkungan sistem Anda dan Anda akan mendapatkan jawaban yang Anda cari saat itu hanya berkaitan dengan komputer Anda.
Sekarang jika Anda terhubung langsung ke modem Anda, prosesnya hampir sama karena modem adalah gateway Anda tetapi submask tidak sama karena Anda mendapatkan informasi langsung dari Server DNS Anda melalui modem dan tidak ditutupi oleh router yang melayani hingga Internet untuk Anda meskipun Anda masih dapat menggunakan kode yang sama karena byte terakhir dari IP yang ditetapkan untuk modem adalah 1. Jadi jika IP yang dikirim dari modem yang berubah adalah 111.111.111.1 'maka Anda akan mendapatkan 111.111.111. (Beberapa nilai byte). Ingatlah bahwa kami perlu menemukan informasi gateway karena ada lebih banyak perangkat yang berhubungan dengan konektivitas internet daripada router dan modem Anda.
Sekarang Anda tahu mengapa Anda TIDAK mengubah dua byte pertama router Anda 192 dan 168. Ini benar-benar dibedakan hanya untuk router dan tidak menggunakan internet atau kami akan memiliki masalah serius dengan Protokol IP dan ping ganda yang mengakibatkan komputer Anda mogok. Gambar bahwa IP router yang Anda tetapkan adalah 192.168.44.103 dan Anda mengklik situs dengan IP itu juga. OH TUHAN! Komputer Anda tidak akan tahu harus melakukan ping apa. Kecelakaan di sana. Untuk menghindari masalah ini, hanya router yang ditugaskan ini dan bukan untuk penggunaan internet. Jadi biarkan dua byte pertama dari router saja.
sumber
255.255.255.0
, dan akan melakukannya dengan cara yang agak rumit IMO.Saya hanya berpikir bahwa saya akan menambahkan sendiri, satu-liner (walaupun sudah ada banyak jawaban berguna lainnya).
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
sumber
Untuk mendapatkan alamat IP publik saat ini, yang perlu Anda lakukan adalah membuat halaman ASPX dengan baris berikut pada acara pemuatan halaman:
sumber
Jika Anda menjalankan dalam intranet Anda akan bisa mendapatkan alamat IP mesin lokal dan jika tidak Anda akan mendapatkan alamat ip eksternal dengan ini: Web:
Desktop:
sumber
Lihat di sini untuk detailnya.
Anda harus ingat komputer Anda dapat memiliki lebih dari satu IP (sebenarnya selalu demikian) - jadi yang mana yang Anda cari.
sumber
Coba ini:
sumber
Mungkin dengan IP eksternal Anda dapat mempertimbangkan (jika Anda berada dalam konteks server Web) menggunakan ini
Saya mengajukan pertanyaan yang sama seperti Anda dan saya menemukannya di ini artikel stackoverflow.
Ini berhasil untuk saya.
sumber
sumber
sumber
Satu baris kode sederhana yang mengembalikan alamat IPV4 internal pertama atau nol jika tidak ada. Ditambahkan sebagai komentar di atas, tetapi mungkin bermanfaat bagi seseorang (beberapa solusi di atas akan mengembalikan beberapa alamat yang perlu difilter lebih lanjut).
Ini juga mudah untuk mengembalikan loopback bukan nol Saya kira dengan:
sumber
IPAddress.Loopback
? :)Untuk menemukan daftar alamat IP saya telah menggunakan solusi ini
Tapi saya pribadi suka solusi di bawah ini untuk mendapatkan alamat IP lokal yang valid
sumber
Solusi LINQ:
sumber
Inilah cara saya menyelesaikannya. saya tahu jika Anda memiliki beberapa antarmuka fisik ini mungkin tidak memilih et persis yang Anda inginkan.
sumber
Pertanyaannya tidak mengatakan ASP.NET MVC tapi saya tetap meninggalkan ini di sini:
sumber
Dapatkan semua alamat IP sebagai string menggunakan LINQ:
UNTUK MENYARANKAN HAK-HAK PRIBADI ...
Pertama, tentukan metode ekstensi
IsPrivate()
:... Dan kemudian menggunakannya untuk menyaring IP pribadi:
sumber
Ini berfungsi untuk saya ... dan seharusnya lebih cepat dalam banyak kasus (jika tidak semua) daripada meminta server DNS. Terima kasih untuk Apprentice Dr. Wily (di sini ).
Sama seperti referensi, ini adalah kode kelas lengkap tempat saya mendefinisikannya:
sumber
Namun cara lain untuk mendapatkan alamat IP publik Anda adalah dengan menggunakan
resolve1.opendns.com
server OpenDNS denganmyip.opendns.com
sebagai permintaan.Di baris perintah ini adalah:
Atau di C # menggunakan nuget DNSClient:
Ini sedikit lebih bersih daripada mengenai titik akhir http dan respons parsing.
sumber
Dan ini untuk mendapatkan semua IP lokal dalam format csv di VB.NET
sumber
Untuk mendapatkan alamat ip jarak jauh, cara tercepat mungkin. Anda harus menggunakan pengunduh, atau membuat server di komputer Anda.
Kelemahan untuk menggunakan kode sederhana ini: (yang disarankan) adalah akan memakan waktu 3-5 detik untuk mendapatkan Alamat IP Jarak Jauh Anda karena WebClient ketika diinisialisasi selalu membutuhkan 3-5 detik untuk memeriksa pengaturan proxy Anda.
Inilah cara saya memperbaikinya .. (pertama kali masih membutuhkan waktu 3-5 detik) tetapi setelah itu akan selalu mendapatkan Alamat IP Jarak Jauh Anda dalam 0-2 detik tergantung pada koneksi Anda.
sumber