Apa perbedaan antara AF_INET dan PF_INET dalam pemrograman soket?

205

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_addrlapangan?

SP Sandhu
sumber
Cukup cari bersih: satu hasil adalah ini
Op De Cirkel
Saya juga bertanya-tanya tentang hal ini. Mereka tampaknya terbiasa secara bergantian dalam panggilan soket di antara coders yang berbeda.
Matt
@MattH Keduanya sama seperti kernel Linux yang baru. Anda dapat menemukan hal yang sama dalam jawaban Duke di bawah ini.
SP Sandhu

Jawaban:

250

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.

Damon
sumber
68

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
Bangsawan tinggi
sumber
yakin Duke, apakah sama untuk kernel sebelumnya juga, maksud saya kernel sebelum versi 3.0?
SP Sandhu
1
Seperti yang saya tahu, dalam semua versi kernel dan libc, PF_ * == AF_ *
Duke
Apakah ini benar pada platform non-linux?
Orang Baik
1
Saya pikir untuk memastikan, Anda perlu memeriksa file header yang disertakan :)
Duke
Di Ubuntu / Debian saya menemukan definisi AF di/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Petr Javorik
48
  • AF = Alamat Keluarga
  • PF = Keluarga Protokol

Artinya, AF_INETmerujuk pada alamat dari internet, alamat IP secara khusus.PF_INETmengacu pada apa pun dalam protokol, biasanya soket / porta.

Pertimbangkan membaca halaman manual untuk socket (2) dan bind (2) . Untuk sin_addrbidang, lakukan sesuatu seperti berikut ini untuk mengaturnya:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 
codemac
sumber
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.

Firo
sumber
4

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.

DINO U
sumber
3

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.

FlyingJester
sumber
6
Tolong jelaskan. Saya temukan #define PF_INET AF_INETdi Cygwin socket.h.
Marquis of Lorne
3

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.

masukkan deskripsi gambar di sini

Rishap Singh
sumber
1
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h
noobninja