Apa perbedaan antara AF_INET dan PF_INET dalam pemrograman soket?
Saya bingung antara menggunakan AF_INET dan PF_INET di socket()
dan bind()
.
Juga, bagaimana cara memberikan ip-address di sin_addr
lapangan?
Apa perbedaan antara AF_INET dan PF_INET dalam pemrograman soket?
Saya bingung antara menggunakan AF_INET dan PF_INET di socket()
dan bind()
.
Juga, bagaimana cara memberikan ip-address di sin_addr
lapangan?
Jawaban:
Panduan pemrograman jaringan Beej yang terkenal memberikan penjelasan yang bagus:
Dalam beberapa dokumentasi, Anda akan melihat penyebutan "PF_INET" mistis. Ini adalah binatang eterial aneh yang jarang terlihat di alam, tapi saya mungkin akan sedikit memperjelasnya di sini. Dahulu kala, diperkirakan bahwa mungkin keluarga alamat (singkatan dari "AF" pada "AF_INET") mungkin mendukung beberapa protokol yang dirujuk oleh keluarga protokol mereka (apa yang dimaksud dengan "PF" dalam "PF_INET" singkatan dari ).
Itu tidak terjadi. Baiklah. Jadi hal yang benar untuk dilakukan adalah menggunakan AF_INET di struct sockaddr_in dan PF_INET dalam panggilan Anda ke soket (). Namun secara praktis, Anda dapat menggunakan AF_INET di mana-mana. Dan, karena itulah yang dilakukan W. Richard Stevens dalam bukunya, itulah yang akan saya lakukan di sini.
Saya menemukan dalam kode sumber kernel Linux bahwa PF_INET dan AF_INET adalah sama. Kode berikut ini dari file include / linux / socket.h , baris 204 dari kernel Linux 3.2.21 tree.
/* Protocol families, same as address families. */
...
#define PF_INET AF_INET
/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Artinya, AF_INET
merujuk pada alamat dari internet, alamat IP secara khusus.PF_INET
mengacu pada apa pun dalam protokol, biasanya soket / porta.
Pertimbangkan membaca halaman manual untuk socket (2) dan bind (2) . Untuk sin_addr
bidang, lakukan sesuatu seperti berikut ini untuk mengaturnya:
struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
man <section> <topic>
, mis man 2 bind
.
Faktanya, AF_ dan PF_ adalah hal yang sama. Ada beberapa kata di Wikipedia yang akan menghapus kebingungan Anda
Konsep desain asli antarmuka soket membedakan antara jenis protokol (keluarga) dan jenis alamat spesifik yang masing-masing dapat gunakan. Diperkirakan bahwa keluarga protokol mungkin memiliki beberapa tipe alamat. Jenis alamat ditentukan oleh konstanta simbolik tambahan, menggunakan awalan AF_ bukan PF_. Pengidentifikasi AF_ dimaksudkan untuk semua struktur data yang secara khusus menangani tipe alamat dan bukan keluarga protokol. Namun, konsep pemisahan protokol dan tipe alamat ini tidak menemukan dukungan implementasi dan konstanta AF_ hanya didefinisikan oleh pengidentifikasi protokol yang sesuai, memberikan perbedaan antara konstanta AF_ versus PF_ argumen teknis tidak ada konsekuensi praktis yang signifikan. Memang, banyak kebingungan ada dalam penggunaan yang tepat dari kedua bentuk.
AF_INET = Format Alamat, Internet = Alamat IP
PF_INET = Format Paket, Internet = IP, TCP / IP atau UDP / IP
AF_INET adalah keluarga alamat yang digunakan untuk soket yang Anda buat (dalam hal ini alamat Protokol Internet). Kernel Linux, misalnya, mendukung 29 keluarga alamat lain seperti soket UNIX dan IPX, dan juga komunikasi dengan IRDA dan Bluetooth (AF_IRDA dan AF_BLUETOOTH, tetapi diragukan Anda akan menggunakannya pada tingkat yang rendah).
Sebagian besar tetap menggunakan AF_INET untuk pemrograman soket melalui jaringan adalah opsi paling aman.
Artinya, AF_INET merujuk ke alamat dari internet, alamat IP secara khusus.
PF_INET mengacu pada apa pun dalam protokol, biasanya soket / porta.
Ada situasi di mana itu penting.
Jika Anda meneruskan AF_INET ke socket()
Cygwin, soket Anda mungkin atau tidak dapat diatur ulang secara acak. Melewati PF_INET memastikan bahwa koneksi berfungsi dengan benar.
Cygwin diakui sebagai kekacauan besar untuk pemrograman socket, tetapi ini adalah kasus dunia nyata di mana AF_INET dan PF_INET tidak identik.
#define PF_INET AF_INET
di Cygwin socket.h
.
Memeriksa file header menyelesaikan masalahnya. Satu dapat memeriksa ada kompiler sistem.
Untuk sistem saya, AF_INET == PF_INET
AF == Alamat Keluarga Dan PF == Protokol Keluarga
Protokol keluarga, sama seperti keluarga alamat.
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h