Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa TIdUDPServer

[es] :: Pascal / Delphi / Kylix :: Problem sa TIdUDPServer

[ Pregleda: 1567 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Problem sa TIdUDPServer03.12.2009. u 14:03 - pre 175 meseci
Program kreira thread u kom se kreira TIdUDPServer. Pri pokušaju destroy-a TIdUPDServer-a javlja se greška.
Greška se javlja samo ako je program primio poruku. Ako napravim Free prije prijema poruke, greška se ne javlja.

Javlja grešku:
... raised exception class EidSocketError with message 'Socket Error # 10004 Interupted system call.'

TIdUPDServer kreiram u proceduri;
Code:

procedure tMyThread.Create();
var Port: integer;
begin
   inherited Create(CreateSuspended);
   self.FreeOnTerminate := true;
   ...
   Port := 6001;
   OkPort := false;
   while not OkPort do begin
      fServer := TIdUDPServer.Create(nil);
      fServer.DefaultPort := Port;
      fServer.BufferSize := 8192;
      fServer.IPVersion := Id_IPv4;
      fServer.ThreadedEvent := false;
      fServer.OnUDPRead := IdSUDPRead;
      try
         fServer.Active := true;
         OkPort := true;
      except
          fServer.Active := false;
          fServer.Free;
          Port := Port + 1;
      end;
   end;
 end;

U Try except isprobavam koji je port slobodan, nisam uspio nači drugi način, sigurno postoji... Možda netko zna kako ga dobiti?

Prijem poruke:
Code:

procedure tMyThread.IdSUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var LMsg: string;
begin                  
   if Length(Adata) > 0 then begin
      lMsg := BytesToString(AData);
      fPorukaPrijem.Append(BytesToString(AData));
   end;
end;


Primeljana poruka se obrađuje u proceduri: tMyThread.Execute;

server destroy-am u destroy procedure threda:
Code:

destructor tMyThread.Destroy;
begin
  fPorukaPrijem.Free;
  if fClient.Connected then fClient.Active := false;
  fClient.Free;
  if fServer.Active then fServer.Active := false;
  fServer.Free;
  inherited;
end;


Poruka o grešci se javi na retku: fClienat.Active := false;

[Ovu poruku je menjao franjo_tahi dana 03.12.2009. u 15:19 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa TIdUDPServer03.12.2009. u 15:20 - pre 175 meseci
> Program kreira thread u kom se kreira TIdUDPServer. Pri pokušaju destroy-a TIdUPDServer-a javlja se greška.
> Greška se javlja samo ako je program primio poruku. Ako napravim Free prije prijema poruke, greška se ne javlja.

Nisam ovo razumeo, proveri da li imaš svežu verziju Indy, često same komponente imaju bug, možeš debugovati i samu komponentu i videti gde tačno dolazi do greške, to često može biti dobar putokaz i zašto dolazi do nje.

> U Try except isprobavam koji je port slobodan, nisam uspio nači drugi način, sigurno postoji... Možda netko zna kako ga dobiti?

Možeš koristiti netstat -a -n i parsirati rezultat. Inače, zašto za svaku promenu porta iznova kreiraš server i ako ti port nije fiksan kako će klijenti znati na koji da se zakače?

 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Problem sa TIdUDPServer03.12.2009. u 22:02 - pre 175 meseci
Hvala na pomoči. Sutra ću probati debagirati samu kontrolu (nisam se uopće sjetio toga...)

Ispričavam se na pogrešci, nastala kod kopiranja koda:
grešku javlja dio koda:
fServer.Active := false;
pogrešno sam napisao da to javlja klijent... :(

Ne znam da li sam napisao: ako program potjeram direktno, bez debuer-a, greška se ne pojavljuje, samo unutar debug-era.

Program komunicaira sa servisom koji ima fiksni port za prihvat podataka, a u podacima koje mu šaljem, šaljem mu i port na koji je okačen server i na koji mi vrača podatke.

Projekt je servis koji se brine o registraciji naših programa. Komunicira sa serverom na kom je baza, provjerava valjanost registracije, brine se o update-u programa...

Svaki program ima ugrađenu klasu koja u zasebnom thread-u komunicira sa servisom.

Uspio sam dobiti da sve radi, ostalo je još par tih sitnica... ovo, messagebox iz servisa i pokretanje programa iz servisa ili javljanje poruke korisniku da ga sam pokrene.

Budući da ranije nisam radio servise, a i thread-ovi mi baš nisu bili najjasniji, dobro je ispalo (dobrim dijelom zahvaljujući vašoj pomoći).
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problem sa TIdUDPServer

[ Pregleda: 1567 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.