Soket programlamasında AF_INET ve PF_INET arasındaki fark nedir?


205

Soket programlamasında AF_INET ve PF_INET arasındaki fark nedir?

Ben de AF_INET ve PF_INET kullanmak arasındaki karıştı socket()ve bind().

Ayrıca, sin_addralana ip adresi nasıl verilir ?


Sadece net arama: bir sonuç bu
Op De Cirkel

Bunu da merak ediyordum. Farklı kodlayıcılar arasındaki soket çağrısında dönüşümlü olarak kullanılıyor gibi görünüyorlar.
Matt

@MattH Her ikisi de yeni Linux Çekirdeği ile aynı. Aynısını Dük'ün cevabında da bulabilirsiniz.
SP Sandhu

Yanıtlar:


250

Beej'in ünlü ağ programlama rehberi hoş bir açıklama yapıyor:

Bazı belgelerde mistik bir "PF_INET" den bahsedeceksiniz. Bu, doğada nadiren görülen garip bir etnik canavardır, ancak burada biraz açıklığa kavuşabilirim. Uzun zaman önce, bir adres ailesinin ("AF_INET" içindeki "AF" nin ne anlama geldiği) protokol ailesi tarafından referans verilen birkaç protokolü destekleyebileceği düşünülüyordu ("PF_INET" içindeki "PF" nin anlamı ).
Bu olmadı. Oh iyi. Yapmanız gereken doğru şey, socket () çağrınızda sockaddr_in ve PF_INET yapısında AF_INET kullanmaktır. Ancak pratik olarak AF_INET'i her yerde kullanabilirsiniz. Ve W. Richard Stevens'ın kitabında yaptığı şey bu olduğundan, burada yapacağım.


68

Linux çekirdeği kaynak kodunda PF_INET ve AF_INET'in aynı olduğunu buldum. Aşağıdaki kod, Linux çekirdeği 3.2.21 ağacının 204 satırı / linux / socket.h dosyasından alınmıştır .

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

emin Duke, önceki çekirdekler için de aynı, 3.0 sürümünden önce çekirdek demek?
SP Sandhu

1
Bildiğim kadarıyla, çekirdek ve libc'in tüm sürümlerinde PF_ * == AF_ *
Duke

Linux olmayan platformlarda bu doğru mu?
İyi Kişi

1
Eminim, dahil edilen başlık dosyasını kontrol etmeniz gerekiyor :)
Duke

Ubuntu / Debian üzerinde AF tanımları buldum/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Petr Javorik

48
  • AF = Adres Ailesi
  • PF = Protokol Ailesi

Anlamı, AF_INETinternetteki adresleri, özel olarak IP adreslerini ifade eder. PF_INET"Protokol", genellikle soketler / bağlantı noktaları gibi herhangi bir şey anlamına gelir.

Soket (2) ve bağlama (2) için kılavuz sayfalarını okuyun . İçin sin_addralanında, sadece ayarlamak için aşağıdaki gibi bir şey yapmak:

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 

teşekkürler @codemac, ben addr.sin_addr.s_addr = inet_addr ("127.0.0.1") kullandım; ama inet_pton () ne içindir?
SP Sandhu

Ayrıca man sayfaları için, man bind (2) veya man bind () yazdığınızda, terminal beklenmedik jeton verir ('hatası verirken, man bind bash yerleşkelerinde bind'in açıklamasını verir. bind () için man sayfasını nasıl elde ederim bind () işlevi?
SP Sandhu

@ jatt.beas: Sözdizimi man <section> <topic>örn man 2 bind.
Frerich Raabe

11

Aslında, AF_ ve PF_ aynı şeydir. Wikipedia'da karışıklığınızı giderecek bazı kelimeler var

Soket arabiriminin özgün tasarım konsepti, protokol türleri (aileler) ve her birinin kullanabileceği belirli adres türleri arasında ayrım yapar. Bir protokol ailesinin çeşitli adres türlerine sahip olabileceği öngörülmüştür. Adres türleri, PF_ yerine AF_ öneki kullanılarak ek sembolik sabitlerle tanımlandı. AF_ tanımlayıcıları, protokol ailesi ile değil, özellikle adres türü ile ilgilenen tüm veri yapıları için tasarlanmıştır. Bununla birlikte, protokol ve adres tipinin ayrılması kavramı uygulama desteği bulamamıştır ve AF_ sabitleri basitçe karşılık gelen protokol tanımlayıcısı tarafından tanımlanmıştır ve AF_ ile PF_ sabitleri arasındaki ayrımı önemli bir pratik sonucu olmayan teknik bir argüman haline getirmiştir. Gerçekten de, her iki formun doğru kullanımında çok karışıklık vardır.


4

AF_INET = Adres Formatı, İnternet = IP Adresleri

PF_INET = Paket Biçimi, İnternet = IP, TCP / IP veya UDP / IP

AF_INET, oluşturduğunuz soket için kullanılan adres ailesidir (bu durumda bir İnternet Protokol adresi). Linux çekirdeği, örneğin, UNIX yuvaları ve IPX gibi 29 adres ailesini ve ayrıca IRDA ve Bluetooth ile iletişimi (AF_IRDA ve AF_BLUETOOTH) destekler, ancak bunları bu kadar düşük bir seviyede kullanacağınızdan şüphelenirsiniz.

Çoğunlukla bir ağ üzerinden soket programlama için AF_INET ile yapışmak en güvenli seçenektir.

Yani, AF_INET özellikle internetteki adresleri, IP adreslerini ifade eder.

PF_INET, genellikle soketler / bağlantı noktaları olmak üzere protokoldeki herhangi bir şeyi ifade eder.


3

Önemli olduğu durumlar var.

AF_INET'i Cygwin'de socket()iletirseniz, soketiniz rastgele sıfırlanabilir veya sıfırlanmayabilir. PF_INET'i geçmek bağlantının düzgün çalışmasını sağlar.

Cygwin kendinden kuşkusuz soket programlama için büyük bir karışıklık, ama bir AF_INET ve PF_INET özdeş olmayan gerçek bir dünya olgusu.


6
Lütfen açıkla. #define PF_INET AF_INETCygwin'lerde buluyorum socket.h.
Lorne Marquis,

3

Başlık dosyası çözmek kontrol sorunu var. Bir sistem derleyicisi olup olmadığını kontrol edebilirsiniz.

Sistemim için AF_INET == PF_INET

AF == Adres Ailesi ve PF == Protokol Ailesi

Protokol aileleri, adres aileleriyle aynı.

resim açıklamasını buraya girin


1
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h
noobninja
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.