Saya ingin mendapatkan alamat IP iPad saya secara terprogram. Bagaimana cara menanyakan subsistem jaringan untuk mengetahui alamat IPv4 (dan IPv6) saya?
PS: Bisakah saya menonaktifkan IPv6?
ios
macos
ip-address
ipv6
Wilbur
sumber
sumber
Jawaban:
Kode berikut menemukan semua alamat IPv4 dan IPv6 di perangkat iOS atau OSX.
getIPAddress
Metode pertama bertindak kurang lebih seperti kode yang lebih lama dalam jawaban ini: Anda dapat memilih salah satu atau jenis alamat lainnya, dan selalu lebih suka WIFI daripada seluler (jelas Anda dapat mengubahnya).Lebih menariknya, ia dapat mengembalikan kamus dari semua alamat yang ditemukan, melewatkan alamat untuk
not up
antarmuka, atau alamat yang terkait dengannyaloopback
. Kode sebelumnya serta solusi lain tentang topik ini tidak akan mendekode IPv6 dengan benar (inet_ntoa tidak dapat mengatasinya). Ini ditunjukkan kepada saya oleh Jens Alfke di forum Apple - fungsi yang tepat untuk digunakan adalah inet_ntop (lihat halaman manual, dan atau lihat artikel inet_ntop ini juga disediakan oleh Jens.Kunci kamus memiliki bentuk "antarmuka" "/" "ipv4 atau ipv6".
EDIT1: Kode diperbarui pada 16 Mei 2014 (bug ditunjukkan oleh lhunath, lihat komentar). Alamat loopback sekarang dikembalikan, tetapi mudah bagi Anda untuk menghapus komentar pada tes untuk mengecualikannya sendiri.
EDIT2: (oleh beberapa orang yang tidak dikenal): Ditingkatkan lebih lanjut 13 Maret 2015: Jika pengguna menggunakan VPN (terlepas dari WiFi atau Seluler), kode sebelumnya akan gagal. Sekarang, ini berfungsi bahkan dengan koneksi VPN. Koneksi VPN diutamakan daripada WiFi dan Sel karena begitulah cara perangkat menanganinya. Ini bahkan harus berfungsi untuk Mac karena koneksi VPN di Mac juga menggunakan IF utun0 tetapi tidak diuji.
EDIT3: (9/8/2016) Mengingat masalah yang dialami oleh @Qiulang (lihat komentar) dengan kode VPN (yang ditambahkan orang lain), saya telah mengomentarinya. Jika ada yang tahu pasti bagaimana menentukan pengguna VPN, silakan bergabung dengan komentar.
sumber
addr
mendapatkan NULL? pengguna saya terkadang mendapatkan NULL. apakah Anda tahu apa kemungkinan alasannya?AF_INET
untuk memeriksa. bisa jadi ini?Dalam file implementasi Anda .m,
sumber
Banyak solusi yang ada hanya mempertimbangkan antarmuka nirkabel, yang tidak akan berfungsi untuk koneksi kabel melalui adaptor Ethernet (mis. Tanpa Wifi atau 3G); lihat solusi yang lebih baru ini yang juga mempertimbangkan alamat IP yang diperoleh melalui antarmuka kabel.
iPad: Cara mendapatkan alamat IP secara terprogram WIRED (bukan melalui nirkabel)
sumber
Dapatkan alamat IP menggunakan Swift 3:
sumber
Solusi saat ini tidak mengembalikan perangkat en0 pada OS X, kode berikut menggunakan Kerangka Konfigurasi Sistem untuk mendapatkan antarmuka kemudian menggunakan fungsi C standar untuk mendapatkan alamat IP.
sumber
Jawaban ini terinspirasi dari jawaban @ DavidH. Saya memperbaiki beberapa masalah, diganti
inet_ntop
dengangetnameinfo
yang memungkinkan pendekatan yang lebih bersih. Perhatikan bahwa ini menghasilkan kamus yang memetakan nama antarmuka ke larik alamat IP (sebuah antarmuka dapat memiliki beberapa IPv4 dan IPv6 yang terkait dengannya, secara teknis). Itu tidak membedakan antara IPv4 dan IPv6:sumber
strf
- apakah itu fungsi pembantu yang Anda miliki dalam kode Anda?err
danstrf
. Anda bisa menggantistrf
dengan-stringWithCString:encoding:
.err
adalahNSLog
pembungkus yang juga mengeluarkan file & baris. github.com/Lyndir/Pearl/blob/master/Pearl/...Jawaban @ DavidH berfungsi dengan baik sampai saya mendapatkan hasil ini dari beberapa jaringan seluler 4G:
Saya tidak menggunakan vpn jadi saya tidak tahu mengapa saya punya utun0 / ipv6.
--- Diperbarui ---
Saya selanjutnya men-debug masalah ini dan menemukan bahwa saya bisa mendapatkan alamat vpn palsu bahkan di jaringan 4G lain (apakah ini bug iOS ??),
Jika saya menggunakan vpn, saya akan mendapatkan ini:
Jadi utun1 BUKAN utun0
Tanpa mencari tahu mengapa saya harus meninggalkan cek vpn :(
---- perbarui ----
Saya melaporkan bug (28131847) ke apple dan menjawab dengan "Tidak semua antarmuka utun untuk VPN. Ada fitur OS lain yang menggunakan antarmuka utun."
Tetapi ketika saya bertanya bagaimana cara mendapatkan alamat IP vpn yang valid, jawaban mereka agak kecewa, "Anda dapat masuk ke Pengaturan -> VPN dan melihat konfigurasi VPN Anda untuk melihat apakah VPN aktif. Dalam beberapa kasus, Anda dapat melihat menetapkan alamat IP di sana juga. Kami sekarang menutup laporan bug ini. " :(
---- perbarui 2016/11/04 ----
Saya mengalami masalah lagi dan saya perlu memodifikasi lebih lanjut jawaban @ DavidH untuk memperbaikinya:
Saya berada di jaringan 4G dan saya mendapat alamat ini:
Dengan jawaban aslinya saya akan mendapatkan wifi IP fe80 :: 8dd: 7d92: 4159: 170e, yang palsu dan koneksi gagal.
Jadi saya memodifikasi kodenya menjadi suka,
sumber
Solusi hebat untuk cepat dalam file ini yang menyajikan semua detail.
Di salah satu aplikasi saya, saya perlu mengambil alamat IP wifi. Saya sudah menggunakan jawaban di atas, di swift 3 seperti ini:
Dalam kode ini, Ini macet karena saya harus memeriksa
nil
di setiap pernyataan yang saya gunakan sebagai opsional?
. Jadi lebih baik bagi saya untuk menggunakan file terkait yang diberikan di kelas saya. Menjadi mudah bagi saya untuk memeriksa sekarang seperti:Saya telah mengurai string
"."
karena Kelas Antarmuka mengembalikan dua antarmuka di iPhone saya untuken0
alamat seperti "fb00 ::" dan alamat seperti "101.10.1.1"sumber
Saya membuat file sederhana untuk mendapatkan alamat ip. Saya mendasarkan solusi ini pada jawaban @ lundhjem, @ DavidH dan @ Ihunath. Ini mempertimbangkan koneksi kabel. Saya belum memasukkan VPN dalam solusi ini.
PCNetwork.h
PCNetwork.m
sumber
di iOS 13.4.1 tidak berfungsi untuk saya. saya menggunakan ini memperbaikinya.
sumber