Przerywanie oczekiwania na połączenie - synapse

0

Przykładowy kod:

Program Serwer;
Uses Crt,
     blcksock;
Var
  Server : TTCPBlockSocket;
  Buff   : Byte;
 
Begin
  ClrScr;
 
  Write ('Czekanie na połaczenie...');
  Server := TTCPBlockSocket.Create;
  Server.Bind('192.168.0.2', '1234');
  If Server.LastError <> 0 Then
  Begin
    Write ('Błąd: ');
    Writeln (Server.LastErrorDesc);
    ReadKey;
    Halt (Server.LastError);
  end;
  Server.Listen; // Te dwie linie
  Server.Socket := Server.Accept; // mnie interesują
  Writeln ('Połączono.');
  Writeln;
 
  Writeln ('Otrzymane dane:');
  Repeat
    Buff := Server.RecvByte (2000);
    Writeln (Buff);
  Until Buff = 0;
  Writeln;
  Writeln ('Koniec');
  Readkey;
end.

W powyższym przykładzie jeśli program nie nawiąże połączenia z klientem to po postu się zawiesi dopóki nie przyjdzie jakieś połączenie. Jest możliwość przerwania oczekiwania na połączenie?

0

Jest możliwość przerwania oczekiwania na połączenie?

Podstawowe pytanie: Zapytałeś googla i poszukałeś w demkach zanim zapostowałeś? W demach dołączanych do downloada są dema w których na pewno to jest. Pewnie w tutorialach też o tym jest. Więc nie mniej mi tego za złe ale POSZUKAJ.

0

Nie kodzę w delphi... ale google mówi, że TTCPBlockSocket ma procedurę "CloseSocket" i powinieneś ją wywołać z innego wątku na mój gust.

Tak tak, i może jeszcze z dwa wątki zrobić żeby sprawdzić czy klient podłączony... Wiesz, nie żebym miał złe to że chcesz pomgać, ale wypada jeszcze coś wiedzieć żeby nie podopowiadać ŹLE, bo to jest najgorsze mi się wydaje.

Btw...

Server.Socket := Server.Accept;

W poprzednim wątku ci tłumaczyłem dlaczego to jest źle, ale jak widać ty masz mnie w głębokim poważaniu, wobec czego pomaganie tobie wygląda na bezcelowe. Licz się z tym że ja ciebię również będę mieć w głębokim poważaniu.

0

Btw...

Server.Socket := Server.Accept;

W poprzednim wątku ci tłumaczyłem dlaczego to jest źle, ale jak widać ty masz mnie w głębokim poważaniu, wobec czego pomaganie tobie wygląda na bezcelowe. Licz się z tym że ja ciebię również będę mieć w głębokim poważaniu.

To jest tylko przykład kodu. Jak dla mnie kod nie musi być hiperpoprawny tylko ma przekazać idee problemu. Jeśli jednak uraziłem Cię kodem z błędem to już się poprawiam. Oto poprawny kod:

Program Serwer;
Uses Crt,
     blcksock;
Var
  Server : TTCPBlockSocket;
  Server_cl : TTCPBlockSocket;
  Buff   : Byte;
 
Begin
  ClrScr;
 
  Write ('Czekanie na połaczenie...');
  Server := TTCPBlockSocket.Create;
  Server.Bind('192.168.0.2', '1234');
  If Server.LastError <> 0 Then
  Begin
    Write ('Błąd: ');
    Writeln (Server.LastErrorDesc);
    ReadKey;
    Halt (Server.LastError);
  end;
  Server.Listen; // Te dwie linie
  Server_cl := TTCPBlockSocket.Create;
  Server_cl.Socket := Server.Accept; // mnie interesują
  Server.Free;
  Writeln ('Połączono.');
  Writeln;
 
  Writeln ('Otrzymane dane:');
  Repeat
    Buff := Server_cl.RecvByte (2000);
    Writeln (Buff);
  Until Buff = 0;
  Writeln;
  Writeln ('Koniec');
  Readkey;
Server_cl.Free
end.

I odpowiedzi sam szukałem, możliwe że niedokładnie. Poszukam jeszcze raz, w razie jak bym nie znalazł to jeszcze napiszę.

0

Post pod postem by podbić temat.

try
  Server.Listen;
finally
  Server_cl := TTCPBlockSocket.Create;
  Server_cl.Socket := Server.Accept;
end;

Dobrze myślę? Ktoś ma może link do wyjaśnień co znaczy try..finally..end?

0

Dobrze myślę? Ktoś ma może link do wyjaśnień co znaczy try..finally..end?

Bym musiał wiedzieć co myślisz żeby wiedzieć czy dobrze. Ale jeżeli chodzi ci o sprawdzanie czy jakiś klient się podłączył to od tego jest metoda CanRead (dam, bo widzę że się męczysz od dawna).

A wytłumaczenie masz przecież w googlach, nawet po polsku: Wyjątki

0
-oho123 napisał(a):

(...) jeżeli chodzi ci o sprawdzanie czy jakiś klient się podłączył to od tego jest metoda CanRead (dam, bo widzę że się męczysz od dawna).

Ok dzięki ale jak tego użyć?

 
Server.Listen;
if Server.CanRead (2000) Then Server.Socket := Server.Accept;

Takie coś mi do głowy wpadło.

0

Oczywiście Synapse jest fajnie, ale widzę że piszesz konsolówkę, to po co tuczyć exek modułami VCL, polecam spróbować pobawić się w WinAPI, a server TCP napiszesz z powodzeniem przy użyciu modułu SimpleTCP dostepnego na: http://piechnat.pl/article/simpletcp.html wraz z przykładem serwera, gdzie również pokazane jest w procedurze konsoli jak go zamknąc. Dosyć późna pora i aktualnie odkopuje się z zaległych postów do czytania, ale mam nadzieję, że może z SimpleTCP będzie Tobie łatwiej. A jak nie to tak jak pisano powyżej Synapse ma w miarę bogatą dokumentację oraz dołaczone dema, które najlepiej sobie przeanalizować.

0

Piszę to w trybie graficznym a właściwie już napisałem. Teraz tylko poprawiam błędy. I chciałbym poznać odpowiedź na moje pytanie :P

0

Ok dzięki ale jak tego użyć?

Mądrze.

Jesteś już całkiem blisko rozwiązania, ale jeżeli chcesz żeby nie blokowało to trybu 'graficznego' (to się okienkowy nazywa) to wrzuć to w loopa, CanRead(0) jako warunek opuszczenia pętli, ew. jakiś sposób na wyjście awaryjne i gotowe... Nie rozumiem w czym masz problem poza myśleniem.

Oczywiście Synapse jest fajnie, ale widzę że piszesz konsolówkę, to po co tuczyć exek modułami VCL, polecam spróbować pobawić się w WinAPI, a server TCP napiszesz z powodzeniem przy użyciu modułu SimpleTCP

Skoro on pyta o CanRead w Synapse, to naprawdę uważasz że da sobie radę z czystym WinApi?! Nie wydaje mi się... Zresztą, sam uważam że już lepiej dodać LCL niż się męczyć z WinApi, bo akurat jakoś nigdy na rozmiarze aż tak mi nie zależało (dzisiaj już prawie wszyscy mają łącze szerokopasmowe, nikt nie ma modemowych 33kb/s). No ale, może jakbym się w to bawił jak Ty, to bym również to uważał za proste i szybkie..

0

Dobra dzięki. Będę miał chwile czasu to wypróbuję pomysł na pętlę już mam. Jak by mi coś nie banglało to się odezwę a jak ruszy to wstawię "ptaszka" :)

Program Serwer;
Uses Crt,
     blcksock;
Var
  Server    : TTCPBlockSocket;
  Dane      : TTCPBlockSocket;
  Buff      : String;
  tmp       : Boolean;
  tmpKey    : Char;

Begin
  ClrScr;

  Write ('Inicjacja serwera...');
  Server := TTCPBlockSocket.Create;
  Server.Bind('127.0.0.1', '1234');
  If Server.LastError <> 0 Then
  Begin
    Write ('Błąd: ');
    Writeln (Server.LastErrorDesc);
    ReadKey;
    Halt (Server.LastError);
  end;
  Server.Listen;
  Dane := TTCPBlockSocket.Create;
  Writeln ('Zakończona.');

  Write ('Czekanie na połaczenie...');
  tmp := False;
  Repeat
    tmp := Server.CanRead (1);
    If tmp Then
    Begin
      Dane.Socket := Server.Accept;
      Server.CloseSocket;
    end;
    If KeyPressed Then tmpKey := ReadKey;
  Until (tmp = True) or (tmpKey = 'q');
  Writeln ('Połączono.');
  Writeln;

  Writeln ('Otrzymane dane:');
  Repeat
    Buff := Dane.RecvString (10000);
    Writeln (Buff);
  Until buff = '';
  Dane.CloseSocket;
end.

Bangla :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.