Veri Türlerini Dönüştür!
Önceki struct'lar ve Veri İle Uğraşmak Sonraki
Veri Türlerini Dönüştür!
Deminden beri şu Ağ ve Konak Bayt Sıralamaları ile yeterince kafa şişirdim şimdi biraz eylem zamanı!
Pekala. Dönüştürebileceğiniz iki tür vardır: short (iki byte) ve long (dört byte). Bu işlevler unsigned ve varyasyonları üzerinde çalışır. Örneğin bir short değişkenin bayt düzenini Konak Bayt Sıralamasından Ağ Bayt Sıralamasına çevirmek istiyorsunuz. "h" ile başlayalım ("host"), sonra "to" ve ardından "n" ("network") son olarak da bir "s" ("short"): h-to-n-s veya htons() ("Host to Network Short" olarak okursanız hatırlamanız kolay olur).
O kadar da zor sayılmaz değil mi...
Aptallarca olanlarını bir kenara bırakırsak "n", "h", "s" ve "l" ile her türlü birleşimi oluşturabilirsiniz. Örneğin tabii ki stolh() ("Short to Long Host") gibi bir işlev yoktur. Fakat şu işlevler vardır:
  • htons() -- "Host to Network Short" -- konaktan ağa short
  • htonl() -- "Host to Network Long" -- konaktan ağa long
  • ntohs() -- "Network to Host Short" -- ağdan konağa short
  • ntohl() -- "Network to Host Long" -- ağdan konağa long
Bu konuyu kavradığınızı düşünüyor olabilirsiniz. Mesela aklınıza şu gelebilir: "char türünde bir verinin Bayt Sıralamasını değiştirmem gerekirse ne yapmam gerekir?" Ve sonra şöyle cevap verebilirsiniz: "Aman, boşver." Ayrıca aklınıza şu da gelebilir: mesela 68000 işlemcili makinanız zaten Ağ Bayt Sıralamasını kullandığına göre htonl() işlevini IP adreslerine uygulamanıza gerek yoktur. Haklı olabilirsiniz. FAKAT eğer geliştirdiğiniz yazılımı öteki türlü Bayt Sıralamasına göre çalışan bir bilgisayara taşırsanız programınız kesinlikle çalışmaz. Taşınabilir programlar yazın! Unutmayın Unix dünyasındasınız! (Her ne kadar Bill Gates aksini düşünmek istese de.) Sakın unutmayın: baytlarınızı ağ üzerinde yolculuğa çıkarmadan önce onları Ağ Bayt Sıralaması'na göre dizeceksiniz.
Son bir noktaya daha dikkat çekmek istiyorum: neden struct sockaddr_in yapısı içindeki sin_port ve sin_addr Ağ Bayt Sıralamasında olmak zorunda iken sin_family böyle bir özelliğe sahip olmak durumunda değil? Cevabı: sin_addr ve sin_port sırası ile IP ve UDP katmanlarında paketlenirler. Bu yüzden Ağ Bayt Sıralamasında gönderilmeleri gerekir oysa ki sin_family sadece işletim sistemi çekirdeği tarafından veri yapısının barındırdığı adresin türünü tespit etmek için kullanılır. Bu yüzden de bu alanın Konak Bayt Sıralamasında bırakılması gerekir. Ayrıca sin_family ağ üzerinden bir yere yollanmadığı için Konak Bayt Sıralamasında olabilir.
Önceki Üst Ana Başlık Sonraki
struct'lar ve Veri İle Uğraşmak Başlangıç IP Adresleri ve Bunlarla Uğraşma Yöntemleri
Bir Linux Kitaplığı Sayfası