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
terima kasih @codemac, saya telah menggunakan addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); tapi untuk apa inet_pton ()?
SP Sandhu
juga untuk halaman manual, ketika saya mengetik man bind (2) atau man bind (), terminal memberikan token yang tidak terduga '(' error sedangkan man bind memberikan penjelasan tentang bind di bash builtins. Cara mendapatkan halaman manual untuk bind (). bind () function?
SP Sandhu
@ jatt.beas: Sintaksnya adalah man <section> <topic>, mis man 2 bind.
Frerich Raabe
11
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.
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.
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.
Jawaban:
Panduan pemrograman jaringan Beej yang terkenal memberikan penjelasan yang bagus:
sumber
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.
sumber
/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:sumber
man <section> <topic>
, misman 2 bind
.Faktanya, AF_ dan PF_ adalah hal yang sama. Ada beberapa kata di Wikipedia yang akan menghapus kebingungan Anda
sumber
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.
sumber
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.
sumber
#define PF_INET AF_INET
di Cygwinsocket.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.
sumber
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h