herkese merhaba,
nmstrm komponentleri hakkında dosya gönderme örneği
göndermiş bir arkadaşımız. sağ olsun var olsun, da,
xp işletim sistemi kuşağında yaşıyoruz...
bu dosya gönderme komponentleri çalışmıyor xp de...
not: bu konu hakkında 2 ocak 2004 tarihli raporumu aktarıyorum müsadenizle
(nostaljilerden esintiler..)
"
Written by neoturk - 02.01.2004
Konu: TCP/IP protokolu üzerinden dosya transferi
Merhaba ortak… Birkaç haftadır kafamı meşgul eden dosya transferinin nasıl
olacağı konusunda epey bir teorik düşünce sarfettim..
kendi yazdığım mini bir programda tcp/ip üzerinden dosya transferini yaptım.
Local olarak %100 olarak çalışıyor, ama kafamda hala cevaplanmamış
sorular var, biraz da ben abartıyorum, çünkü tekli dosya transferinden
ziyade multi-transfer olayının olmasını istiyorum.
Bunun yanı sıra multi-transfer olurken multi-connect
işlemini de desteklemesini istiyorum. Teoride biraz zor görünüyor,
pratikte biraz uğraştırır. Kafayı takarsam yaparım diyorum ama şu an
için gereği yok.. zaten böyle bir şeyi yaptığımda
kazaa türü program yapmış oluyoruz..
Herneyse, kodu ben de incelemek istiyorum.
Yerine oturtmam gereken kodlama ve düşünsel mantıklarım var.
Ne zamandır analizleyememiştim şimdi başlıyoruz….
Basit bir client arabirim ve basit bir server arabirim
programı yazmıştım, içinden kritik kodları çektim ve tek tek analiz etmek istedim.
Böylece senin de fikirlerini almış olurum, daha iyi irdelemiş oluruz..
Öncelikle vurgulamak istediğim çok önemli analizler var:
1. Internet programcılığı ile uğraşıyor isek
( bu trojan veya her neyse fark etmez ) kesinlikle ve kesinlikle DOSYA TRANSFERİ
olayının %100 sorunsuz olarak çözülmesi gerekiyor.
Çünkü bağlantı sağlanmasında bir problem yok,
ancak er ya da geç dosya transfer olayına ihtiyaç duyulacak!
Bunun için bu konunun bizzat çözümlenmesi ve kendi mantığımıza göre
işleme geçmesi gerekiyor.
2. Delphi olsun CBuilder olsun,
bu programlama dillerinde dosya transfer işini gören NMSTRM
adlı komponent (paket) serisi var.
Hemen hemen tüm programcılar bu komponentleri kullanırlar.
( Çok önemli dip not: Okuduğum birçok delphi kitabında
(okumadığımı yok denecek kadar parmakla gösterebilirim)
dosya transfer örneklerini nedense hep nmstrm komponentleri
üzerinde anlatırlar. Oradaki örneklerde dosya transferleri çalışır.
Oturur yazarsın ve her şeyin çalıştığını görünce bir şeyler öğrendiğini sanırsın..
doğrudur.. ama Level2'ye geçtiğinde NMSTRM komponentlerinin yetersiz
olduğunu ben dahil deneyimli coderler er geç fark etmişlerdir…
Bu nedenle oturup adam gibi kodunu kendin yazmalısın..
( icq gibi, paltalk gibi.. )
3. Örnek trojanlar incelendiğinde nedense çoğunda
dosya transfer olayının nasıl yapıldığı gösterilmemiştir.
Bunu gösteren tek örnek trojan kodu LATINUS trojanıdır.
( tek tük bazı trojanlarda da mevcut ancak tarihi eser kalıntılarıyla dolu
ve çalışmayan kod parçacıklarıdır )
4. Latinus trojanındaki dosya transfer işlemi Multi-File
yöntemini destekleyen şekilde transfere müsaade ediyor,
ama kullanımı pek etkin değil.. denedim kullandım çalıştırdım ama etkin değil..
hangi dosyanın ne zaman vardığı, nereye gittiği Allah kerim..
gidiyor dosyalar ve direkt temp klasörüne kopyası çıkartılıyor..
kodu yazan adam biraz kulağını SAĞ'dan göstermiş..
welhasıl pek verimli bir kod değil…
5. Dosya göndermek gerçekten önemli bir konu, nedenine gelince,
coderlerin %99'u ( abartmıyorum ) nmstrm komponentini kullanırlar
ve kullanacaklardır. Oturup sıfırdan kodunu yazması inan kasıyor…
işin komik yanı da network içinden dışarıya bağlantı yapıldığında
nmstrm componentleri dosya transferlerini yapamıyor..
bunu ya bilerek es geçtiler ya da unuttular..
çünkü bizim daha önceki yazdığımız tüm versiyonlarda nmstrm
komponentlerini kullanmıştım. O yüzden network-dialup arasındaki dosya
transferleri olmuyordu. ( network içinden evdeki pcye bağlantı örneğinde olduğu gibi )
( ama msn veya icq bunu gayet güzel yapıyor değil mi ? )
6. Çok ince bir nuans daha var, tcp/ip ( socketler )
üzerinden dosya göndereceğimiz zaman 2 seçeneğimiz var.
Block ve None-Block seçimi… block işlemli socketlerde bir sonraki gelen veri
paketi cache socket belleğinde tutulur. Aktif olan veri dosyaya
yazıldıktan sonra cache socket belleğinden alır ve
böylece işlemler devam eder.. ( winsock topolojisi ).
none-block seçimi yaparsak cache bellekte veri tutulmaz.
Gelen veri direkt işlenir. İşlenen bir veri sırasında şayet
ikinci bir veri paketi gelirse bu paket boşa gide çünkü cache
bellekte tutulmaz… burada şöyle bir sorun var, winsock cache bellek dolar elbet…
bu durumda da aynen 3ün 1ini alırız… bu sorunun düzeltilmesi
konusundaki bazı profesyonel yaklaşımları birkaç programda görmüştüm..
bunlardan en etkini de bildiğimiz icq ve msn dosya transferleri…
7. Benim amacım cache belleğin dolmasına müsaade etmeden ping-pong
( paketi aldım-sonrakini gönder) mantığına göre veri paketlerini sırayla göndermek.
( icqdaki file send speed olayı, 1-5 arası hız seçimi vardı hatırlarsan.. olayın özü burada yani… )
etc ...
"
son not:
azmin sonu başarıdır !
yıl 2006, şirketler arası file-sharing/multy_file_sent/multy-chat programları ile bu
konuya son noktayı koydum.
hepinize iyi günler iyi çalışmalar, hayırlı işler diliyorum
"Türk Coderler Her Zaman Zeki ve Güçlüdür"
saygılarımla_ [ xxnt03@lycos.co.uk ]