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_addr
alana ip adresi nasıl verilir ?
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_addr
alana ip adresi nasıl verilir ?
Yanıtlar:
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.
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
/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Anlamı, AF_INET
internetteki 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_addr
alanı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);
man <section> <topic>
örn man 2 bind
.
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.
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.
Ö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.
#define PF_INET AF_INET
Cygwin'lerde buluyorum socket.h
.
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ı.
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h