Skocz do zawartości

[delphi] Wysyłanie plików - pytania


Max1414

Polecane posty

Witam!

Chciałbym zrobić program do przesyłania plików P2P za pomocą socket'ów.

 

Mam takie dwa pytania:

- jak rozwiązać problem wysyłania do osób za NATem? Można by jakiś centralny server postawić, ale to odpada.

- jak rozwiązać sprawę statusów? Jak je pobierać, czy ktoś jest dostępny? Co 1s sprawdzać czy da się do każdej osoby na liście połączyć? Ale to troche niewydajne? Znowu jakbym do bazy danych wysyłał statusy to w wypadku zerwania połączenia będzie, że dalej jest ktoś dostępny.

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

1. Server, lub przez proxy lub przez PnP ale nie robilem nic w tych klimatach wiec nie pomoge.

2.robi sie to przez server. Uzytkownik loguje sie na server i co jakis czas wysyla 'keep alive' jak przestanie to wysylac to znaczy ze nie jest podlaczony. Ewentualnie jak wysle jakies polecenie typo exit to zmienia mu sie status. Polecam poczytac specyfikacje serverow irc tam jest to dobrze opisacne + jest gotowy protokol.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

1. Server, lub przez proxy lub przez PnP ale nie robilem nic w tych klimatach wiec nie pomoge.

2.robi sie to przez server. Uzytkownik loguje sie na server i co jakis czas wysyla 'keep alive' jak przestanie to wysylac to znaczy ze nie jest podlaczony. Ewentualnie jak wysle jakies polecenie typo exit to zmienia mu sie status. Polecam poczytac specyfikacje serverow irc tam jest to dobrze opisacne + jest gotowy protokol.

 

No to odnosnie drugiego to znam to, ale chciałbym się obyć bez servera ;] no ale chyba nie da rady :) Będę musiał odrzucić statusy, ew. sprawdzanie na życzenie czy coś:)

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

jesli nie chcesz serwera centralnego to zbuduj sobie siec rozproszona.

przy starcie klient musi miec jeden punkt wejscia (inny komp). Laczy sie do niego i prosi o liste innych adresow, robi sobie cache i nawiazuje polaczenie z np 10 losowymi, przy czym informuje kazdego z nich o tym do jakich jest polaczony.

 

jesli ktorys z wezlow zmieni swoj stan (status) informuje nody ktore sa z nim polaczone, a te nody broadcastoja do swoich polaczen itd, wiadomosc sie rozchodzi po calej sieci.

 

Problematyczne moze byc synchronizowanie statusu sieci ale koncept wydaje sie dosyc ciekawy.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Tylko nie stosuj czasem "konstrukcji":

 

try
 // kod
except
end;

Zawsze trzeba jakoś obsłużyć wyjątek (zalogować, cokolwiek...), a jak nie obsługujesz go to przekazuj dalej (raise). W przypadku błędów stracisz mnóstwo czasu na ich znalezienie, bo będziesz je maskował takim cudakiem.

҉

Link do komentarza
Udostępnij na innych stronach

nic z tego ;]... cały dzień dzisiaj spędziłem, żeby znaleźć takie połączenie tego wszystkie, żeby nie pojawiały się errory... no i udało się, ale i tak mnie to nie satysfakcjonuje, bo zdarza się, że jeszcze czasem wyskoczą...

 

W ogóle pierwszy raz miałem do czynienia z takimi nielogicznymi błędami, po prostu masakra, aż nie wiem jak wam to opisać, heh :)

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

Wyłączyłem teraz, ale nadal to samo :), nie wiem co jest grane, może i ja gdzieś coś głupiego zrobiłem, ogólnie pisałem wszystko tak byle było, bo chciałem sprawdzić jak to będzie działać, dopiero później miałem zamiar ładnie kodzik przerobić...

 

Tak czy siak, nie ma takiego burdelu, żeby to nie powinno działać.

 

Może jutro pokaże kodzik... tylko musze troche opisać i pozmieniam komponenty na standardowe, żebyście mogli skompilować :)

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

Nie wiem jakich komponentow/klas uzywasz, ale jesli masz cliejnta stawianego na formie jako komponent to nie wywoluj na nim free, robi to forma, moze dlatego miales AV.

 

Bledy z kosmosu to najczesciej bledy z watkow, nie wiem czy tego uzywasz ale jesli tak to stawialbym na to ze zwalniasz obiekty do ktorych chca sie jeszcze odwolywac inne watki.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Nie wiem jakich komponentow/klas uzywasz, ale jesli masz cliejnta stawianego na formie jako komponent to nie wywoluj na nim free, robi to forma, moze dlatego miales AV.

 

A przypadkiem cechą Free nie jest to, że nawet po wywołaniu na obiekcie, który już został zwolniony, nie powoduje błędu? Gdzieś tak słyszałem..

Link do komentarza
Udostępnij na innych stronach

tak pod warunkiem ze jest to metoda statyczna lub taka ktora nie odwoluje sie do pol klasy.

 

Ja osobiscie odradzam stosowanie free na rzecz FreeAndNil.

dla zainteresowanych, kod w C++ ale w delphi jest ten sam mechanizm (tak nawiasem jest to mechanizm pozwalajacy na wygranie kolejnego piwa ;) )

 


--------------------- dupsko.h
#ifndef test_h
#define testXXB]YP[J
N]]NBZ[BYFW7CÓ6VćF`GW6ść7\06ć6VFRŃ(ąŃ(ąąiostream>

void TTest::CosTam(){
       std::cout<<"[i][[YHNB[XZ[[&v2D4\"&weEFW7BGCEFW7BTfwC65F(źź%ąŃŃ(%(%Ń(%Ń)(

 

oczywiscie efektem bedzie AV, ale wywalcie z TTest::CosTam odwolanie do fTest i sprobojcie jeszcze raz... prawie jak czary ;)

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

EDIT: Ech, znów nie zauważyłem odpowiedzi Toster'a ;-D

 

Raczej nie ;-)

procedure A();
var
 Obj: TObject;
begin
 Obj := TObject.CrX]NYNH[YN[łŚźŚ+&Wh9\"{Ł}śjx, V(n7ZzfZzZaYHXYNY[Y[    [[FW7G&ŚVćC

I jeśli obiekt jest zwolniony, a nie ma przypisanego nil, to będzie próbował zwolnić coś, co jest już zwolnione, czyli -> AV.

 

Tu można poczytać trochę o tym: http://groups.google.com/group/borland.pub...0f82d0b26ab5a63

҉

Link do komentarza
Udostępnij na innych stronach

  • 5 months later...

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...