Di internet ada beberapa tempat yang menunjukkan kepada Anda cara mendapatkan alamat IP. Dan banyak dari mereka terlihat seperti contoh ini:
String strHostName = string.Empty;
// Getting Ip address of local machine...
// First get the host name of local machine.
strHostName = Dns.GetHostName();
Console.WriteLine("Local Machine's Host Name: " + strHostName);
// Then using host name, get the IP address list..
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
IPAddress[] addr = ipEntry.AddressList;
for (int i = 0; i < addr.Length; i++)
{
Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString());
}
Console.ReadLine();
Dengan contoh ini saya mendapatkan beberapa alamat IP, tetapi saya hanya tertarik untuk mendapatkan alamat yang diberikan oleh router ke komputer yang menjalankan program: IP yang akan saya berikan kepada seseorang jika ia ingin mengakses folder bersama di komputer saya untuk contoh.
Jika saya tidak terhubung ke jaringan dan saya terhubung ke internet secara langsung melalui modem tanpa router maka saya ingin mendapatkan kesalahan. Bagaimana saya bisa melihat apakah komputer saya terhubung ke jaringan dengan C # dan jika kemudian mendapatkan alamat IP LAN.
c#
networking
Tono Nam
sumber
sumber
If I am not connected to a network and I am connected to the internet
Pernyataan ini sepertinya kontradiktif. Apakah Anda mencoba mencari tahu apakah komputer Anda terhubung ke LAN pribadi atau Internet?Jawaban:
Untuk mendapatkan Alamat IP lokal:
Untuk memeriksa apakah Anda terhubung atau tidak:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
sumber
Ada cara yang lebih akurat ketika ada alamat multi ip yang tersedia di mesin lokal.
Connect
soket UDP dan baca titik akhir lokalnya:Connect
pada soket UDP memiliki efek sebagai berikut: ia menetapkan tujuan untukSend
/Recv
, membuang semua paket dari alamat lain, dan - yang kami gunakan - mentransfer soket ke keadaan "terhubung", mengatur bidang yang sesuai. Ini termasuk memeriksa keberadaan rute ke tujuan sesuai dengan tabel routing sistem dan mengatur titik akhir lokal yang sesuai. Bagian terakhir tampaknya tidak terdokumentasi secara resmi tetapi sepertinya sifat integral dari Berkeley sockets API (efek samping dari keadaan "terhubung" UDP) yang bekerja dengan andal di Windows dan Linux di seluruh versi dan distribusi.Jadi, metode ini akan memberikan alamat lokal yang akan digunakan untuk terhubung ke host jarak jauh yang ditentukan. Tidak ada koneksi nyata yang dibuat, maka ip jarak jauh yang ditentukan dapat dijangkau.
sumber
Refactoring kode Mrcheif untuk meningkatkan Linq (mis. Net 3.0+). .
:)
sumber
Saya tahu ini mungkin menendang kuda mati, tapi mungkin ini bisa membantu seseorang. Saya telah mencari di mana-mana cara untuk menemukan alamat IP lokal saya, tetapi di mana-mana saya menemukan mengatakan untuk menggunakan
Saya tidak suka ini sama sekali karena hanya mendapatkan semua alamat yang diberikan ke komputer Anda. Jika Anda memiliki beberapa antarmuka jaringan (yang hampir semua komputer lakukan sekarang-a-hari), Anda tidak tahu alamat mana yang cocok dengan antarmuka jaringan mana. Setelah melakukan banyak penelitian, saya membuat fungsi untuk menggunakan kelas NetworkInterface dan menarik informasi darinya. Dengan cara ini saya bisa tahu apa jenis antarmuka itu (Ethernet, nirkabel, loopback, terowongan, dll), apakah itu aktif atau tidak, dan SOOO lebih.
Sekarang untuk mendapatkan alamat IPv4 dari panggilan antarmuka jaringan Ethernet Anda:
Atau antarmuka Nirkabel Anda:
Jika Anda mencoba untuk mendapatkan alamat IPv4 untuk antarmuka nirkabel, tetapi komputer Anda tidak memiliki kartu nirkabel yang terpasang, itu hanya akan mengembalikan string kosong. Hal yang sama dengan antarmuka Ethernet.
Semoga ini bisa membantu seseorang! :-)
EDIT:
Telah ditunjukkan (terima kasih @NasBanov) bahwa meskipun fungsi ini berfungsi untuk mengekstraksi alamat IP dengan cara yang jauh lebih baik daripada menggunakannya
Dns.GetHostEntry(Dns.GetHostName())
tidak baik untuk mendukung beberapa antarmuka dengan tipe yang sama atau beberapa alamat IP pada satu antarmuka. . Ini hanya akan mengembalikan satu alamat IP ketika mungkin ada beberapa alamat yang ditetapkan. Untuk mengembalikan SEMUA alamat yang ditugaskan ini, Anda cukup memanipulasi fungsi asli untuk selalu mengembalikan array alih-alih string tunggal. Sebagai contoh:Sekarang fungsi ini akan mengembalikan SEMUA alamat yang ditugaskan untuk jenis antarmuka tertentu. Sekarang untuk mendapatkan hanya satu string, Anda bisa menggunakan
.FirstOrDefault()
ekstensi untuk mengembalikan item pertama dalam array atau, jika kosong, kembalikan string kosong.sumber
item.OperationalStatus
selalu kembaliUnknown
.Ini adalah versi modifikasi (dari versi compman2408) yang berfungsi untuk saya:
Anda dapat memanggil metode ini misalnya seperti:
Perubahan: Saya mengambil IP dari adaptor yang memiliki IP gateway yang ditugaskan untuk itu. Perubahan kedua: Saya telah menambahkan docstring dan break statement untuk membuat metode ini lebih efisien.
sumber
break
di bagian paling dalamif
ataureturn
akan melakukan trik.Ini adalah kode terbaik yang saya temukan untuk mendapatkan IP saat ini, menghindari host VMWare atau alamat IP tidak valid lainnya.
sumber
Saya pikir menggunakan LinQ lebih mudah:
sumber
Untuk tertawa, saya pikir saya akan mencoba dan mendapatkan pernyataan LINQ tunggal dengan menggunakan operator bersyarat nol C # 6 yang baru. Terlihat sangat gila dan mungkin sangat tidak efisien, tetapi berhasil.
Kesopanan logis dari
Gerardo H
(dan dengan referensicompman2408
).sumber
Cara lain untuk mendapatkan IP menggunakan ekspresi LINQ:
sumber
@ Mrcheif Saya menemukan jawaban ini hari ini dan itu sangat berguna walaupun ia mengembalikan IP yang salah (bukan karena kode tidak berfungsi) tetapi memberikan IP internetwork yang salah ketika Anda memiliki hal-hal seperti Himachi berjalan.
sumber
192.0.0.0/8
bukan tes yang benar untuk alamat IP pribadi (ada 3 rentang, semuanya berbeda dari yang satu ini), bisa juga menjadi rentang jaringan perusahaan, jadi tidak terlalu "lokal".Diuji dengan satu atau beberapa kartu LAN dan mesin Virtual
sumber
Hanya versi saya yang diperbarui menggunakan LINQ:
sumber
Prasyarat: Anda harus menambahkan referensi System.Data.Linq dan merujuknya
sumber
Saya juga kesulitan mendapatkan IP yang benar.
Saya mencoba berbagai solusi di sini tetapi tidak ada yang memberi saya pengaruh yang diinginkan. Hampir semua tes bersyarat yang disediakan menyebabkan tidak ada alamat yang digunakan.
Inilah yang bekerja untuk saya, semoga membantu ...
sumber
sumber
Perlu diingat, dalam kasus umum Anda dapat memiliki beberapa terjemahan NAT berlangsung, dan beberapa server dns, masing-masing beroperasi pada tingkat terjemahan NAT yang berbeda.
Bagaimana jika Anda memiliki NAT tingkat operator, dan ingin berkomunikasi dengan pelanggan lain dari operator yang sama? Dalam kasus umum Anda tidak pernah tahu pasti karena Anda mungkin muncul dengan nama host yang berbeda di setiap terjemahan NAT.
sumber
Sudah lenyap, ini bekerja untuk saya
sumber
Memperbarui jawaban Mrchief dengan Linq, kita akan memiliki:
sumber
Ini mengembalikan alamat dari setiap antarmuka yang memiliki alamat gateway dan alamat unicast dalam dua daftar terpisah, IPV4 dan IPV6.
sumber
Sudah ada banyak jawaban, tetapi saya masih memberikan salah satu jawaban saya:
Satu liner:
Catatan: Cari dari yang terakhir karena masih berfungsi setelah beberapa antarmuka ditambahkan ke perangkat, seperti MobileHotspot, VPN atau adaptor virtual mewah lainnya.
sumber
Selain itu hanya kode sederhana untuk mendapatkan Ip Klien:
Semoga ini bisa membantu Anda.
sumber
sumber
Kode compman2408 yang dimodifikasi untuk dapat beralih melalui masing-masing
NetworkInterfaceType
.Dan Anda bisa menyebutnya seperti ini:
sumber
Di bawah aksi yang sama
Fungsi LocalIP ()
Dim Host As String = Dns.GetHostEntry (Dns.GetHostName) .AddressList (1) .MapToIPv4.ToString
txtIP.Text = Host
Kembali benar
Fungsi Akhir
sumber
satu baris kode: D
sumber
Jika Anda memiliki mesin virtual atau kartu jaringan tambahan, mungkin ada nilai lain dalam daftar alamat. Saran saya adalah untuk memeriksa entri daftar alamat dan mencetak yang sesuai. Dalam entri kasus saya 3 adalah alamat ipv4 mesin saya
Jangan lupa menambahkan
using System.Net;
sumber