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.