Mega Code Archive

 
Categories / Delphi / Forum
 

Neoturk - re ağ üzerinden veya internetten ip adresine göre dosya alma ve gönderme

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 ]