delphi UDP problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mcansız
Üye
Mesajlar: 6
Kayıt: 16 Eki 2014 05:20

delphi UDP problemi

Mesaj gönderen mcansız »

merhaba arkadaşlar bir server kart bana veri yolluyor bende bilgisayardan verileri ekrana yansıtıyorum.

sistem söyle 123 verisini yolladığım zaman kartım adc verilerini yollamaya başlıyor ve her 200ms de bu veriyi yollamak zorundayım
gelen verileri delphi indy companentini kullanıp timer ile 200ms bir 123 yolayıp adc(data) alıyorum ve labellere yerleştiriyorum burada sıkıntı yok herşey normal çalışıyor

bilgisayarın internet bağlantısı kestiğimde(jak çıkarıldığında veya server kart kapatıldığında) veri gelmeye devam ediyor :? yani program hata da verimiyor, delphi internet yokken bu verileri nereden alıyor?

delphi kodlarım

Kod: Tümünü seç


procedure TForm1.FormCreate(Sender: TObject);
begin

IdAntiFreeze1.Active:=true; //ekleyin yoksa kilitlenirsiniz
IdAntiFreeze1.OnlyWhenIdle:=true;
IdAntiFreeze1.IdleTimeOut:=10

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

IdUDPClient1.Host:=Edit1.Text;
IdUDPClient1.Port:=10001;
IdUDPClient1.ReceiveTimeout:=10;
IdUDPClient1.Connect;
IdUDPClient1.Send('123');
Timer1.Enabled:=true;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var
buffer: Array of char;
i:byte;
metin,sonuc:ansistring;
begin

        if IdUDPClient1.Connected then
        begin
           IdUDPClient1.Send('123');
           gelenveri:=IdUDPClient1.ReceiveString();
           sonuc:=leftStr(gelenveri,4); //sağdan 5 karakteri al
           Form1.Caption:=sonuc;

                if sonuc='adc1' then  Label1.Caption:=gelenveri;
                if sonuc='adc2' then  Label2.Caption:=gelenveri;
                if sonuc='adc3' then  Label3.Caption:=gelenveri;
                if sonuc='adc4' then  Label4.Caption:=gelenveri;

        end;
    end;

En son mcansız tarafından 17 Eki 2014 12:42 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: delphi UDP problemi

Mesaj gönderen G.Arkas »

Host olarak hangi adresi giriyorsunuz?
Aginizda Sizden baska bilgisayar ve bu bilgisayara bagli bahsettiginiz karttan var mi?
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: delphi UDP problemi

Mesaj gönderen thelvaci »

Konu ile direkt alakalı değil ama kullandığınız timer'ın hassasiyeti 2 ms. değildir. Aslında Windows işletim sistemlerinde o kadar hassas bir zamanlamayı yakalamak da son derece güçtür. Yine de size multimedia timer'lara gözatmanızı öneririm.
mcansız
Üye
Mesajlar: 6
Kayıt: 16 Eki 2014 05:20

Re: delphi UDP problemi

Mesaj gönderen mcansız »

G.Arkas yazdı:Host olarak hangi adresi giriyorsunuz?
Aginizda Sizden baska bilgisayar ve bu bilgisayara bagli bahsettiginiz karttan var mi?
host adresi 10.0.0.254 port 10001

ağda tek bilgisayar ve tek kart var başka cihaz yok
thelvaci yazdı:Konu ile direkt alakalı değil ama kullandığınız timer'ın hassasiyeti 2 ms. değildir. Aslında Windows işletim sistemlerinde o kadar hassas bir zamanlamayı yakalamak da son derece güçtür. Yine de size multimedia timer'lara gözatmanızı öneririm.
evet orayı hatalı yazmışım timer interval degeri 200 bu da 200ms eder delphi ile mikroişlemci tarafını karıştırmışım bir an :wink:
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: delphi UDP problemi

Mesaj gönderen SimaWB »

WireShark ile datanın nereden (hangi IP'den) geldiğini görebilirsiniz.

Bence sıkıntı IdUDPClient1.Connected'da. UDP protokolü Connectionless bir protokoldür. Dolayısıyla IdUDPClient1.Connected ile maalesef o anda gerçekten sunucu ile bağlantınız olup olmadığını kontrol edemezsiniz. İsterseniz bir kere Connect olduktan sonra sunucu cihazı kapatıp IdUDPClient1.Connected değerini kontrol edin. Yine True olduğunu göreceksiniz. Siz istemci tarafta IdUDPClient1.Disconnect yapmadıkça IdUDPClient1.Connected hep True olur maalesef.
There's no place like 127.0.0.1
mcansız
Üye
Mesajlar: 6
Kayıt: 16 Eki 2014 05:20

Re: delphi UDP problemi

Mesaj gönderen mcansız »

gelen veriler adc1adc2adc3 şeklinde devam ediyor bunu değiştirip bir değişkeni(char tipi) sürekli arttırıp yolladım sayıları düzenli olarak görmek için 100ms de bir gönderdim 0..255 0.. 255 şeklinde sayılar ekranda gözüktü interneti kapattığımda sayma işlemi de durdu sorun benim adc değişkenlerini çok hızlı bir şekilde göndermem ve

Kod: Tümünü seç

 gelenveri:=IdUDPClient1.ReceiveString();


kodunda IdUDPClient1.ReceiveString() fonksiyonunu bu verilerle şişmesi haliyle internet kesilse bile gelenveri değişkeninde hafızada kalan veriler tekrar yükleniyor.

Şimdi benim IdUDPClient1.ReceiveString() fonksiyonunu her okumadan sonra temizlemem lazım bunu şimdilik beceremedim yada IdUDPClient companenti bağlantının kopmasını algılatmama lazım tuhaf bir durum ki UDP haberlemesinde bağlantı kopmaları algılanamıyormu
SimaWB yazdı:WireShark ile datanın nereden (hangi IP'den) geldiğini görebilirsiniz.

Bence sıkıntı IdUDPClient1.Connected'da. UDP protokolü Connectionless bir protokoldür. Dolayısıyla IdUDPClient1.Connected ile maalesef o anda gerçekten sunucu ile bağlantınız olup olmadığını kontrol edemezsiniz. İsterseniz bir kere Connect olduktan sonra sunucu cihazı kapatıp IdUDPClient1.Connected değerini kontrol edin. Yine True olduğunu göreceksiniz. Siz istemci tarafta IdUDPClient1.Disconnect yapmadıkça IdUDPClient1.Connected hep True olur maalesef.
hım demek algılanamıyor peki udp haberleşmesinde client tarafından bağlantının olup olmadığını anlayan bir companent varmı ?

internetten edindiğim bir udp terminal programında kartımı denedim

Resim

burada 123 verini gönderdiğimde veri akışı çok hızlı bir şekilde sağlanıyor interneti kestiğimde duruyor bu programda delphide yazılmış (peid söyledi)
bu programı yazan bu işlemi nasıl yapmış ben gelen veriyi okumadamı yanlış yapıyorum

yada indy de bu sorunumu çözecek bir algoritma varmı network de ilk defa proje yapıyorum vakit ayıran herkese teşekkürler
mcansız
Üye
Mesajlar: 6
Kayıt: 16 Eki 2014 05:20

Re: delphi UDP problemi

Mesaj gönderen mcansız »

indy coponentini brakıp udpsocket companentini kullandım bağlantıyı yukarıdaki program gibi alabiliyorum interneti kestiğimde veri akışı duruyor ve uygulama kitleniyor
try.. except komutlarını ekledim değişen birşey yok kodlar aşağıda uygulamanın kitlenmemesi için ne yapmam gerek.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var oku:ansistring;
begin
UdpSocket1.Connect;
UdpSocket1.Sendln('123');
Timer1.Enabled:=true;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var oku:ansistring;
begin
 try
    UdpSocket1.Sendln('123');
    oku:=UdpSocket1.Receiveln();

    Memo1.Lines.Add(oku);
     except
         begin
            timer1.Enabled:=false;
            edit1.Text:='hata';
            UdpSocket1.Disconnect;
            UdpSocket1.Active:=false;

         end;
         end;

end;
Cevapla