Autor Téma: Synapse - jak zistit ze ma FTP server odpojil?  (Přečteno 2403 krát)

Offline psholty2

  • Příspěvků: 38
  • Karma: 1
Synapse - jak zistit ze ma FTP server odpojil?
« kdy: 24-09-2012, 14:12:30 »
Pouzivam TFTPSend z ftpsend.pas (synapse). Ked sa pripojim na FTP server tak premenna TFTPSend.Sock.Socket je vacsia ako 0, nie je to ale spolahlivy udaj lebo ked ma po nejakom case kvoli necinnosti FTP server odpoji tak ta premenna je stale > 0. Potreboval by som nejak spolahlivo zistit ci je spojenie este aktivne. Nemozem volat nejaku "readonly" operaciu lebo ak urobim hociaky request ked ma FTP server vzdialene odpojil tak cely klient zamrzne a uz sa s tym neda nic robit.
Pokial nie je uvedené inak moje otázky vo fóre sa týkajú Delphi 7, Windows 7 64bit

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #1 kdy: 24-09-2012, 14:56:02 »
Pouzivam TFTPSend z ftpsend.pas (synapse). Ked sa pripojim na FTP server tak premenna TFTPSend.Sock.Socket je vacsia ako 0, nie je to ale spolahlivy udaj lebo ked ma po nejakom case kvoli necinnosti FTP server odpoji tak ta premenna je stale > 0. Potreboval by som nejak spolahlivo zistit ci je spojenie este aktivne. Nemozem volat nejaku "readonly" operaciu lebo ak urobim hociaky request ked ma FTP server vzdialene odpojil tak cely klient zamrzne a uz sa s tym neda nic robit.
Ta hodnota Sock.Socket je jen zapamatovane handle. Aby te server neodstrih, tak bys mel udrzovat spojeni pomoci NOOP. Tim bys zaroven zjistoval, ze uz te odstrih. No a aby to nekousalo ksicht aplikace, je treba veskerou komunikaci dat do samostatnych threadu, protoze Synapse pouziva blocking styl komunikace, takze bys z hlavni threadu nemel nikdy komunikovat.

Offline psholty2

  • Příspěvků: 38
  • Karma: 1
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #2 kdy: 24-09-2012, 15:20:13 »
> je treba veskerou komunikaci dat do samostatnych threadu,

Co ked zamrzne synapse v tom samostatnom threade? Jak to potom prerusim/ukoncim?
Pokial nie je uvedené inak moje otázky vo fóre sa týkajú Delphi 7, Windows 7 64bit

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #3 kdy: 24-09-2012, 15:29:55 »
Co ked zamrzne synapse v tom samostatnom threade? Jak to potom prerusim/ukoncim?

TBlockSocket ma metodu AbortSocket

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 221
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #4 kdy: 24-09-2012, 20:09:40 »
Predne je dobre hodit oko na tohle: http://synapse.ararat.cz/doku.php/public:howto:activeconnection

Nutno si uvedomit jednu vec - zjistit, ze te server odpojil, to jeste docela jde. Ale zjistit, jestli nebylo spojeni upalene, nebo jestli neuhnilo, to proste nejde zjistit jinak, nez neuspesnym pokusem o komunikaci.

Proto snad vsechny protokoly, u kterych se ocekava delsi spojeni se serverem, maji nejakou tu NOOP operaci. Operaci, ktera nic nedela, jen tim klient da serveru najevo, ze jeste zije. A naopak, server da uspesnou odpovedi najevo, ze vse funguje. On totiz i server resi uplne stejny problem, jestli k nemu pripojeny klient davno neuhnil.

kdyby se to dalo resit nejak jednoduse, treba zjistovanim nejakeho stavu socketu, tak by nikdo ty NOOP operace nepotreboval a nenamahal se s nima.

Offline Jan Fiala

  • Příspěvků: 49
  • Karma: 0
    • PSPad editor
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #5 kdy: 25-09-2012, 06:45:14 »
Na druhou stranu se servery už nějakou dobu brání udržování spojení (zvlášť ty vytíženější na internetu) a posílání NOOP detekují a odpojí tě.
Pak pomůže (většinou) střídání různých příkazů, které nic nedělají NOOP, SYS, PWD, PASV, atd. ideálně v náhodném pořadí.

Offline psholty2

  • Příspěvků: 38
  • Karma: 1
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #6 kdy: 26-09-2012, 11:34:41 »
Precital som si "Thready v delphi" (http://semi.gurroa.cz/Clanky/Threads.html) a mam taky pocit ze by to nevyriesilo moj problem, pretoze ked to zamrzne (nieco vnutri synapse), tak proste nebude kedy vnutri threadu prerusit (while cyklus v execute).

Zvazujem ci by nebolo lepsie izolovat FTP cast (pripojenie, kopirovanie suborov, odpojenie) do samostatneho execka a nejakym velmi primitivnym sposobom (napr. zapisat % priebehu do lokalneho suboru), ak to na nejaky cas zastane na 30% tak viem ze to zamrzlo a ten proces normalne odstrelim a budem pokracovat dalej alebo to skusim znova.
Pokial nie je uvedené inak moje otázky vo fóre sa týkajú Delphi 7, Windows 7 64bit

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1136
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #7 kdy: 26-09-2012, 12:19:22 »
mas docela spatny pocit :)
ve vlakne to sice zamrzne, ale z hlavniho vlakna (aplikace) zavolas nejakou funkci vlakno.Terminate,
ve ktere bude prave to AbortSocket nebo neco v tom smyslu (pripadne nasilne sestrelis vlakno)

navic, naco chces prubeh zapisovat do lokalniho souboru? to prece pri prubehu budes vracet hlavnimu vlaknu a ten
bude rozhodovat, co dal s tim

Offline psholty2

  • Příspěvků: 38
  • Karma: 1
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #8 kdy: 26-09-2012, 12:52:37 »
> ve vlakne to sice zamrzne, ale z hlavniho vlakna (aplikace) zavolas nejakou funkci vlakno.Terminate,

Procedura Terminate pouze nastaví property Terminated=True. V metode Execute je treba sledovat tu premennu (FTerminated) a vyskocit z hlavnej slucky v Execute. Ak je to zamrznute niekde inde nema kto vyskocit. Mohol by som overridnut a volat AbortSocket ale ci ho to skutocne "odmrzne" netusim.

> naco chces prubeh zapisovat do lokalniho souboru?
Je to v casti kde zvazujem cely FTP kod dat do samostatneho execka, nie threadu.

Hlavny problem z hladiska ladenia je ze to zamrznutie neviem u seba nasimulovat, deje sa to len u zakaznika tak raz za tyzden.
Pokial nie je uvedené inak moje otázky vo fóre sa týkajú Delphi 7, Windows 7 64bit

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1136
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #9 kdy: 26-09-2012, 13:21:51 »
sam to znam, nikdy se mi to nestalo, ale uzivatelum to taky nekdy zamrzne ... na pricinu ani reseni jsem neprisel (akorat ze u Indy, ne synapse ... zrejme nejaka systemova kravina)

spatne jsem se vyjadril s tim Terminate ...
mel jsem na mysli vlasti proceduru at uz si to nazves jakkoliv (napr. Abort), ktera bude soucasti public casti vlakna,
a tuto proceduru zavolas z hlavniho vlakna, tim by se melo prerusit spojeni
(jestli to i na tento problem bude fungovat je otazka)

maximalne bys pak musel pouzit fakt nejakou hard-core metodu na sestreleni vlakna

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2668
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #10 kdy: 26-09-2012, 14:31:00 »
Hlavny problem z hladiska ladenia je ze to zamrznutie neviem u seba nasimulovat, deje sa to len u zakaznika tak raz za tyzden.
Hlavni problem je, ze se tyhle problemy nikdy neresi simulaci a ladenim, ale kvalifikovanou analyzou a spravnym navrhem...

Jinak se zda, ze jsi dalsi z rady, kdo se nechal zblbnout IMHO nestastnym zapouzdrenim threadu (z pohledu OS) do tridy TThread v Delphi...

K tomu abortu: princip spociva v tom, ze tim abortem zavres handle socketu, ktery se ucastni te zablokovane FTP operace, ktera pak drive ci pozdeji vyfuci na chybu. Pozor, FTP protokol pouziva dva sockety: ridici a datovy. A k tomu, abys to mohl abortnout, staci, kdyz u sveho potomka TThread pridas public metodu AbortSocket a v ni zavolas
Kód: Delphi [Vybrat]
  1. try
  2.   FFTPSend.DSock.AbortSocket;
  3. except
  4. end
  5. try
  6.   FFTPSend.Sock.AbortSocket;
  7. except
  8. end
  9.  

Tohle reseni ma jeden zasadni nedostatek, ze v okamziku, kdy z jineho (hlavniho) threadu, sahas na FFTPSend.Sock, tak nevis, jestli obsahuje platnou instanci a synchronizovat se s blokujicim threadem nemuzes, takze to musis risknout a pochytat pripadne chyby. Na druhou stranu, pravdepodobnost takoveho jevu je v tomto pripade rozumne mala.

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 221
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Synapse - jak zistit ze ma FTP server odpojil?
« Odpověď #11 kdy: 26-09-2012, 15:31:20 »
Krom toho tvrdeho sestreleni socketu bych jeste rad upozornil na moznost preruseni probihane cteci/zapisove operace pomoci property StopFlag. Testuje se s frekvenci HeartbeatRate. Zrovna pro ucely zabijeni polomrtvych spojeni staci ten interval docela velky, klidne i v radu vterin. (rozumnej, cim vetsi interval, tim mensi zatez systemu, ale vetsi reakcni doba.)