Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 2 odgovora
  • 2.017 pregleda

Najnovija ↓

Problem sa TIdUDPServer 03.12.2009. u 15:03 · pre 205 meseci
izmenjeno 1 put, poslednji put franjo_tahi 03.12.2009. u 15:19
  1. franjo_tahi03.12.2009. u 15:19zapis iz teksta poruke
#1
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;
Re: Problem sa TIdUDPServer 03.12.2009. u 16:20 · pre 205 meseci #2
> 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?
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Problem sa TIdUDPServer 03.12.2009. u 23:02 · pre 205 meseci #3
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).
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme