Çocuklar kaldığımız yerden devam ediyoruz.
Bu nedenle, ağdaki iletişim halindeki makinelerin sorunla karşılaştığı ve aşağıdaki iki nedenden
dolayı birbirleriyle mesaj alışverişi yapamadığı iki senaryoyu tartışacağız.
Yani, makineler farklı ve uyumsuz olduğunda.
Yani, farklı satıcılar tarafından farklı donanımlar kullanılarak, farklı yazılımlar veya farklı diller veya farklı
derleyiciler kullanılarak üretilirler.
Ya da herhangi bir sebep olabilir.
Ve ağdaki makineler seçildiğinde yeni yazılım sürümüne yükseltilir ve bazı makineler mevcut
yazılım sürümleriyle bırakılır.
Ancak bazı seçici makineler yeni yazılım sürümüne yükseltilir.
Bu nedenle, iletişim halindeki makinelerin birbirleriyle mesaj alışverişinde karşılaştıkları sorunları
aşağıdaki iki senaryoda ele alacağız.
Bu yüzden ilerlemeden önce bilgilerimizi gözden geçirelim.
Ve C'yi 32 bitlik bir sisteme göre tartışacağız.
Yani 32 bit sistem, bu sistemdeki işaretsiz tamsayı veri tipinin boyutunun dört bayt olduğu anlamına gelir.
Evet.
Bu 32 bit sistemin tanımıdır.
Diyelim ki bu formatta bir mesaj yapısı x mesajımız var ve ağdaki makineler aslında
bu formatta mesaj alışverişi yapıyor.
Bu formatı ayrıntılı olarak ele alırsak, altı alanı vardır ve 32 bitlik bir makine olduğu için, işaretsiz tamsayı
veri türünün boyutu dört bayttır.
Ve tabii ki ikinci üye, karakter veri tipi dizisi olan yönlendirici adıdır.
Ve veri tipi bakımının boyutu tüm makinelerde bir bayttır.
Bu nedenle, yönlendirici adı alanı 32 bayt boyutunda olacaktır ve bu yapıdaki diğer alanlar unsigned
int türünde veya boyutundadır, bu nedenle boyutları dört bayttır.
Şimdi ofsete gelelim.
Ofset, bir alanın bir yapının başlangıcından itibaren yer değiştirmesi anlamına gelir.
Örneğin, burada bir X yapısı mesajınız var.
Dolayısıyla, iki numaralı alan arayüz adresinin ofseti, bu alanın bu yapının başlangıç adresinden kaç bayt
uzakta olduğu olacaktır.
Peki iki numaralı alan arayüz adresinin ofseti ne olacak?
Dört artı 32 artı dört olacak.
Böylece alan arayüz adresi ikinin ofseti 40 bayt olacaktır.
Doğru.
Yani ofset, bu alanın yapı içinde yer değiştirmesi anlamına gelir.
Diyelim ki elinizde bir yapı X mesaj yıldızı Peter var.
Ve Peter'ın struct x mesaj türündeki nesnenin bulunduğu bir bellek konumuna işaret ettiğini varsayalım.
Hafızada mevcut.
Dolayısıyla, bu yapının herhangi bir üyesine eriştiğiniz anda, örneğin, iki numaralı arayüz adresine erişirsiniz.
Bu, başlangıç adresinden itibaren 40. baytta dört bayt okuduğunuz veya yazdığınız anlamına gelir.
Doğru.
Örneğin, bellekte struct x mesaj türünde bir nesneniz olduğunu ve başlangıç adresinin
2000 olan a olduğunu varsayalım.
Öyleyse, struct x mesaj türündeki nesnenin başlangıç adresinin 2000 olduğunu varsayalım.
Doğru.
Yani 2040 yılı sahanın başlangıç adresi olacaktır.
Arayüz adresi iki çünkü bu alanın ofseti 40'tır.
Doğru.
Ve bu alanın boyutu dörttür çünkü bu alanın veri türü unsigned int'tir.
Yani bu ifadeyi yazdığınız an, yani işaretçi ok arayüz adresi iki, 2040 bellek konumunda
bulunan bu yapının başlangıç adresinden itibaren 40. bayttaki dört baytlık veriyi okuduğunuz
ya da yazdığınız anlamına gelir.
Yapının bu alanından ya da bu alana dört bayt veri okuyor ya da yazıyorsunuz.
Doğru.
Tüm bunları açıklıyorum çünkü gelen slaytlardaki sorunu anlamak için See'deki
yapı düzenini, yani yapıların ve nesnelerin bir sistemin belleğinde nasıl düzenlendiğini iyice anlamanız
gerekiyor.
Şimdi ilerleyerek, gerçek sorunu görmeye çalışalım.
Diyelim ki 32 bit makine olan A makinesine sahipsiniz.
Ve diyelim ki 64 bit makine olan B makinesine sahipsiniz.
Bu da A makinesindeki unsigned int boyutunun dört bayt, B makinesindeki unsigned int boyutunun ise
sekiz bayt olduğu anlamına gelir.
Şimdi, sırasıyla A ve B makineleri tarafından üretildiklerinde tel üzerindeki mesaj düzenini
görelim.
Böylece A makinesi mesajı oluşturduğunda ve mesajı burada bulunan kabloya yerleştirdiğinde bunu
görebilirsiniz.
Dolayısıyla, A makinesi tarafından oluşturulan mesaj düzeni şu şekildedir.
Dört baytlık bir IP adresi, ardından 32 baytlık yönlendirici adı ve geri kalan alanların her birinin dörder bayt olduğunu
görebilirsiniz.
Dolayısıyla, A makinesi struct x mesaj türünde bir mesaj ürettiğinde ve mesajı kabloya yerleştirdiğinde mesaj
düzeni bu olacaktır.
B makinesi 64 bitlik bir makine olduğu için B makinesi için de benzer şekilde.
Bu nedenle, bir struct x mesajındaki unsigned int türündeki tüm alanların sekiz bayt kaplayacağını
görebilirsiniz.
Dört bayt yerine.
Yani, yani, makineye göre mesaj düzeni budur.
B Böylece farkı, makine tarafından üretilen mesajı görebilirsiniz.
A ve B makinesi tarafından üretilen mesaj.
Şimdi A makinesi tarafından üretilen mesaj B makinesi tarafından alınır. Şimdi B makinesinin makine tarafından
üretilen mesajı nasıl okuyacağını görelim.
A.
Şimdi diyelim ki A makinesi B makinesinden bir mesaj aldığında, A ve B makineleri
ayrı ayrı çalıştığından ve X yapısının tanımı A ve B makinelerinde makinenin türüne göre,
A ve B makinelerinin donanım mimarisine veya derleyicisine veya işletim
sistemine göre farklılık göstereceğinden, A'nın mesajı X
mesajının tanımına olan inancına göre yazacağını görebilirsiniz.
Doğru.
Peki A, 32 bitlik bir makine olduğu için işaretsiz tamsayının boyutunun dört bayt olduğuna
inanıyor.
Dolayısıyla, A makinesi ağ üzerinden B makinesinden X mesajını aldığında, A mesajı
kendi yapısal X mesajı tanımına göre yazacaktır.
Böylece tamponun aslında B makinesinden alınan mesaj olduğunu ve şimdi A'nın bu mesajı okumak için typecast
yapacağını görebilirsiniz.
Bu mesaj, bu mesajı yazacaktır.
Ve iki struct x mesaj formatı.
Ve şimdi her zamanki gibi C'de, yapının alanlarını nasıl okursunuz.
Yapının alanlarını aşağıdaki gibi okursunuz.
Yani buradaki sorunu görebilirsiniz.
A makinesi yapının ilk üyesi olan geri döngü IP'sini okumaya çalıştığında, bu A makinesinin sadece
dört bayt okuduğu anlamına gelir çünkü a makinesinin bakış açısına göre geri döngü IP alanı dört
bayttır.
Yani A makinesi aslında sekiz bayt almıştır, ancak A makinesi yalnızca dört bayt okumuştur.
Doğru.
Yani birinci sorun.
Ardından makine yönlendirici adını okumaya başladığında.
Böylece B'nin bakış açısından yönlendirici adının mesajın başlangıcından itibaren sekiz baytta başladığını görebilirsiniz.
Yani B'nin bakış açısından yönlendirici adının mesajın başlangıcından itibaren sekizinci baytta
başladığını görebilirsiniz, ancak a'nın bakış açısından yönlendirici adı mesajın başlangıcından itibaren dördüncü baytta
başlar.
Yani bu ifade, A makinesinde çalıştırıldığında okumaya çalışacaktır.
Dördüncü bayttan gelen mesaj.
Yani bellekteki mesajın gerçek düzeni şudur.
Alınan mesaj budur.
Ancak A, mesajın dördüncü baytından yönlendirici adını okumaya çalışıyor.
Yani buradan itibaren dördüncü bayt.
Bu da başka bir sorun.
Yani buradaki sorun A makinesinin mesajı almış olmasıdır.
B makinesinden ve B makinesi bu formattaki mesajı üretir.
Ancak Makine A mesajı bu formata göre okumaya çalışıyor.
Doğru.
Yani arı formatımız ve as formatımız var.
Yani bu, birinin size İspanyolca yazılmış ama İngilizce kelimeler kullanan
bir mektup vermesi kadar iyi, değil mi?
Ve siz İngilizce anlıyorsunuz ve bu mektubu sadece İngilizce olarak okumaya çalışıyorsunuz, ama hiçbir
şey anlamayacaksınız.
Doğru.
İşte sorun bu.
Yani A, a'da veri bozulmasına yol açan bir çöpü okumaya başlar, çünkü B'deki veri
türlerinin boyutu A'nınkinden farklıdır.
Dolayısıyla, B makinesinde unsigned int veri türünün boyutu sekiz bayt iken, A makinesinde unsigned
int veri türünün boyutu dört bayttır.
Dolayısıyla, sorunun temel nedeni bu veri türü uyuşmazlığıdır.