Evet arkadaşlar, başlangıç olarak, dosya ekindeyim ve başlangıç olarak.
Dediğim gibi, her yönlendirme tablosu girişinin ek üyeleri olacaktır.
Üyelerden biri olarak bir zamanlayıcıya ve bu zamanlayıcıyı
kaç milisaniye çalıştıracağımızı tutacak bir değişkene sahip olalım.
Tartıştığımız gibi bu hash'i sabit olarak tanımlayalım.
Şimdi de bu API'ye son argümanı ekleyelim.
Bu, milisaniye cinsinden sona erme süresidir.
Yani slaytta tartıştığımız gibi yapıyoruz.
Şimdi, yönlendirme tablosuna yüklenmekte olan yönlendirme tablosu girişi için
zamanlayıcıyı başlatmak üzere bu fonksiyonun uygulamasını nasıl geliştireceğimizi görelim.
Bu yüzden etkinliğe gelecekler.
C dosyasına geleceğim ve burada fonksiyona ek bir argüman ekledim.
Şimdi, buraya basitçe bir çek koyacağım.
Milisaniye cinsinden sona erme süresi sıfır değilse, bu
yönlendirme tablosu girişi için bir zamanlayıcı oluşturacağım.
Ve kurulum zamanlayıcısı çağrısını kullanarak bir zamanlayıcıyı nasıl oluşturacağımızı zaten biliyoruz.
Şimdi işaretçiyi, zamanlayıcının süresi dolduğunda ateşlenecek olan geri arama işlevine aktarın.
Tamam.
Dolayısıyla, zamanlayıcının süresi dolduğunda bu geri arama işlevi çağrılacaktır.
Şimdi, bu geri arama fonksiyonunun argümanı ne olmalıdır?
Yönlendirme tablosu girişinin kendisine bir işaretçi aktaralım.
Hatalar için.
Bir başlık dosyası ekleyebilirsiniz.
Bir çalışma.
Ve sonra bu zamanlayıcıyı basitçe başlatacağız.
Bu kadar.
Bunlar yapmamız gereken basit kod değişiklikleridir.
Bu fonksiyonun uygulanması ile işimiz bitti.
Şimdi bu fonksiyonda ne uygulamamız gerektiğini kontrol etmemiz gerekiyor.
Önemli olan kavram budur.
Yani bu fonksiyona zamanlayıcı geri çağrısı denir.
Ve bu fonksiyonun imzasını veya prototipini zaten biliyoruz.
İlk argüman, zamanlayıcının kendisinin işaretçisi olmalıdır.
İkinci argüman ise herhangi bir uygulama verisidir, bizim durumumuzda bu
uygulama verisi yönlendirme tablosu girişinin işaretçisinden başka bir şey değildir.
Böylece yönlendirme tablosu girişini geçtik.
Yönlendirme tablosunun işaretçisini getirelim.
Her yönlendirme tablosu girdisi yönlendirme tablosuna bir geri işaretçi içerir.
Ve bu fonksiyonun amacı yönlendirme tablosu girişini silmek olduğu için.
Tamam.
Bu nedenle, yönlendirme tablosu girişini silmek için bir API çağıracağız ve işimiz bitecek.
Böylece yönlendirme tablosu girişinin zamanlayıcısı sona erdiğinde, bu fonksiyon çağrılacak ve bu
fonksiyon da yönlendirme tablosu girişini yönlendirme tablosundan silmek için API'yi çağıracaktır.
Ve işimiz bitti.
Ancak tablo henüz sona ermiş değil.
Yönlendirme tablosu girişini sildiğimizde, zamanlayıcıyı da temizlememiz gerekir.
Şimdi zamanlayıcı bir tane daha.
Yönlendirme tablosu girişi tarafından tutulan veri yapısı.
Yönlendirme tablosu girişini sildiğimizde, zamanlayıcısını da temizlememiz gerekir.
Bu yüzden girişi silme fonksiyonuna geleceğim ve bu fonksiyona, yönlendirme tablosu girişini gerçekten
silmeden önce bu yönlendirme tablosu girişinin zamanlayıcısını temizlemek için bir kod ekleyeceğim.
Tamam.
Bir veri yapısını sildiğinizde, bu veri yapısının içinde bulunan tüm
iç içe geçmiş veri yapılarını da silmeniz gerektiği oldukça açıktır.
Aksi takdirde bellek sızıntısına neden olursunuz.
Ya da başka bir deyişle, kaynakları temizlemeliyiz.
Bu yüzden bu yönlendirme tablosu girişinin null olmayan bir sona erme zamanlayıcısına sahip olup olmadığını kontrol ediyorum.
Eğer timer gerçekten varsa, o zaman timer kütüphanesi tarafından sağlanan ve timer'ı
sil olarak adlandırılan bir API'yi çağıracağım ve bu işaretçi yapısını null'a atayacağım.
Böylece zamanlayıcıyı temizledik ve işimiz bitti.
Bu, yapmamız gereken çok basit değişikliklerdir.
Zamanlayıcılarla çalışmanın oldukça kolay ve anlaşılır olduğunu görebilirsiniz.
Herhangi bir zamanlayıcı kütüphanesi ile çalışırken aynı kurallar dizisine, aynı disipline uymanız gerekir.
Ve şimdi C dosyasında bazı küçük değişiklikler yapmamız gerekiyor
çünkü bu dosyadan sadece insert new entry'yi çağırıyoruz.
Bu API'ye yeni bir ek argüman eklediğimizi unutmayın.
Bu argümanı bu işleve ve bu paket işleme işlevine basitçe aktarmak için,
yönlendirme tablosu girişinin sona erme zaman aralığını 30.000 milisaniye olarak başlatın.
Çünkü bu yönlendirme tablosu girişini ağ
üzerinden oluşturacağız ya da ağdan öğreneceğiz.
Ve son değişiklikler, yönlendirme tablosu girişini
görüntüleyeceğimiz zaman, bunu görüntüleyelim olacaktır.
Yönlendirme tablosu girişinin süresinin dolmasına
kaç milisaniye kaldı? Pekala.
Bunun için bu fonksiyonu tabloyu görüntüleyecek şekilde güncelleyeceğiz.
Biz de bunu yapıyoruz.
Şimdi bir kütüphane bize bir API zamanlayıcı sağlıyor.
Kalan süreyi milisaniye cinsinden alın.
Her zaman.
Şimdi bir proje olan programı derleyeyim ve özellikleri çalıştırayım.
Port numarası 40,001'i dinleyen bir paket dinleyici iş parçacığı başlatayım.
Yine diyelim ki 40.000'de ve diyelim ki 40.002'de.
Tamam.
Ve şu an itibariyle herhangi bir yönlendirme tablosu girdim yok.
Diğer pencerede betiği, UDP rotalarını ve benzerlerini çalıştıracağım.
Böylece STP projeme 100 rota gönderecek.
Bakalım.
Şu anda 300 kayıt var.
Çok üzgünüm.
300 rota gönderecektir.
Böylece bu girişlerin burada olduğunu ve son kullanma zamanlayıcılarının çalıştığını görebilirsiniz.
Milisaniye cinsinden sona erme süresini gösteriyor ve tüm bu girişlerin süresi yakında dolacak.
Beş saniye kaldı, üç saniye kaldı, iki saniye kaldı ve tada, gitti.
Yani tüm girişler, zamanlayıcılarının süresi dolduğu için gitti.
Umarım bu projede çok faydalı şeyler öğreniyorsunuzdur.
Asenkron programlamanın yanı sıra, artık zamanlayıcılardan nasıl yararlanacağınızı öğreneceksiniz.
Şimdi bir sonraki ders videosunda bunu tartışacağız.
Anomali nedir? Zamanlayıcı kütüphanesinden yararlanarak
STP projemize dahil ettik.