Tcp server hakkında.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
seci20

Tcp server hakkında.

Mesaj gönderen seci20 »

Ustalarım öncelikle herkese selamun aleykum. Offline olarak hazırladığım programları sürekli olarak kırıyorlar. Java kart ile güvenliğini sağlıyorum ama malasef her türlü bir şekilde kırıyorlar. O yüzden server sistemi kurmaya karar verdim. Programdan şifreli şekilde kullanıcı adı ve şifre gelicek, serverden onay aldıktan sonra gerekli olan string cliente şifreli şekilde göndericek. Yanlız ufak bir kaç sorum var.

1.Tcp server kursam aktif kullanıcı sayısı 100 ile 200 lerde olsa sorun yaşarmıyım ?

2. Daha önce mysql server kurup oradan onay alıp çalışmıştım ama mysql bilgilerini programda tutmak zorunda olduğum için malasef onuda kırmışlardı.

3. Tcp server harici nasıl veri alışverişinde bulunabilirim ? Daha seri ve hatasız olarak ?

4.String verileri nasıl saklayabilirim ?



Server konusunda çok iyi değilim bilgi veren ustalarım olursa çok memnun olurum.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tcp server hakkında.

Mesaj gönderen freeman35 »

Merak ettim, ne programı bunlar? biri programını kırıyorsa çok iyi bir şey, demek ki çok kullanışlı bir şey(ler) bunlar.
usb kilit dangle kullanabilirsin. Bunları zor kırarlar. ama sorun senin şifre kontrol procedure yada function larında, kurgunda sorun olabilir. Mesela Sifre diye bir function sonucu True ise çalış gibi bir şeyse bunu kırma işine başlayan ilk kişiler hex editörlerle yapıyorlar.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
seci20

Re: Tcp server hakkında.

Mesaj gönderen seci20 »

freeman35 yazdı: 28 Oca 2019 10:22 Merak ettim, ne programı bunlar? biri programını kırıyorsa çok iyi bir şey, demek ki çok kullanışlı bir şey(ler) bunlar.
usb kilit dangle kullanabilirsin. Bunları zor kırarlar. ama sorun senin şifre kontrol procedure yada function larında, kurgunda sorun olabilir. Mesela Sifre diye bir function sonucu True ise çalış gibi bir şeyse bunu kırma işine başlayan ilk kişiler hex editörlerle yapıyorlar.
Hocam telefon yazilim onarimi uzerine. Daha profesyonel olanlarida kiriyorlar. Java kart mantigini tamamen cozduklerini dusunuyorum. Hemen hemen java kart ile korunan tum programlari kirdilar. O yuzden server sistemi kurmaya karar verdim en azindan tum kaynaklari serverde tutarim. Kirarlarsada kapatirim kimse kullanamaz
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tcp server hakkında.

Mesaj gönderen freeman35 »

https://sentinel.gemalto.com/software-m ... l-hasp-hl/
her sene şirket el değiştiriyor :) Ankara da temsilcilri olacaktı.
server bağlantıda olabilir ama bunun için client tarafında port yönlendirme ve firewall sıkıntın çıkacak. Delphi için turbo power bileşenleri var. bunda yanılmıyorsam crypto bileşenleri olacaktı. Ayrıca stream sıkıştırma seti, zip yani. yanılmıyorsam adı abbrevia.
gereken bilgileri sıkıştır şifrele hatta arka arkaya 2-3 kere şifrele. sonra bunu kendi sitene gönder. gönderme işi basit. baya bi eskiden yapmıştım. değerleri bir php sayfasına parametre olarak gönder. burda gereken işlemleri yaptır, log tut vs sana kalmış. sonra bu php sonuç döndürsün. gene aynı şekilde, sıkıştırılmış ve 2-3 kez şifrelenmiş. senin programın da bu sonucu çözümlesin. bu işi içinde sadece internet bağlantısı yeter. hatta bunu hosting firması yerine kendi evindeki bir pc ye IIS kurarak bile yapabilirsin.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
seci20

Re: Tcp server hakkında.

Mesaj gönderen seci20 »

cevap verdiğiniz için teşekkür ederim hocam. Aynı bu mantıkla yapıyorum bende zaten hocam. Şifreliyorum öyle gönderiyorum.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Tcp server hakkında.

Mesaj gönderen mkysoft »

Web üzerinden sadece lisansı kontrol ederseniz programınız yine de kırılabilir. Kullanıcı kitlenizin bilgi seviyesi anladığım kadarıyla ortalamanın üstünde. Bu sektörde gördüğüm kadarıyla genelde fiziksel makinalar kullanılıyor. Makinanın çok bir işlevi olduğunu sanmıyorum, telefonlara yazılımı bu donanım yüklüyor/haberleşiyor. Böylece kullanıcılar donanım almak zorunda kalıyorlar. Böyle bir donanım aracılığı ile satış yapmak zor olabilir, sadece uygulama satmak daha kolaydır muhtemelen.
Yazılımın işlevini bilmiyorum ama eğer hesaplamalar yapıyorsa bunu sunucu üzerinden almanız. Uygulamanız cihazdan gerekli verileri okuyup yapacağı işlem ile birlikte sunucuya gönderecek, sunucu gerekli işlemleri yaparak, cihaza gönderilecek neredeyse ham veriyi üretecek. Gelen veri cihaza gönderilecek. Firmware gibi büyük dataların gönderilip alınması zor olacağından muhtemelen iyi bir yöntem olmayacaktır.
seci20

Re: Tcp server hakkında.

Mesaj gönderen seci20 »

mkysoft yazdı: 29 Oca 2019 06:09 Web üzerinden sadece lisansı kontrol ederseniz programınız yine de kırılabilir. Kullanıcı kitlenizin bilgi seviyesi anladığım kadarıyla ortalamanın üstünde. Bu sektörde gördüğüm kadarıyla genelde fiziksel makinalar kullanılıyor. Makinanın çok bir işlevi olduğunu sanmıyorum, telefonlara yazılımı bu donanım yüklüyor/haberleşiyor. Böylece kullanıcılar donanım almak zorunda kalıyorlar. Böyle bir donanım aracılığı ile satış yapmak zor olabilir, sadece uygulama satmak daha kolaydır muhtemelen.
Yazılımın işlevini bilmiyorum ama eğer hesaplamalar yapıyorsa bunu sunucu üzerinden almanız. Uygulamanız cihazdan gerekli verileri okuyup yapacağı işlem ile birlikte sunucuya gönderecek, sunucu gerekli işlemleri yaparak, cihaza gönderilecek neredeyse ham veriyi üretecek. Gelen veri cihaza gönderilecek. Firmware gibi büyük dataların gönderilip alınması zor olacağından muhtemelen iyi bir yöntem olmayacaktır.
hocam aynen düşündüğünüz gibi zaten. Bende aynen öyle yapacağım şuan tcp server client kurdum ama daha mantıklı farklı bir protokol varmı onu tam bilmiyorum. Önerileriniz varsa daha az hatalı ve sorunsuz olan onla yapmak isterim.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: Tcp server hakkında.

Mesaj gönderen mkysoft »

tcp seviyesinde uğraşmak zor olabilir, soap servislere bakabilirsiniz.Bu iş için Delphi ile birlikte gelen datasnap var, çok daha kolay olur işiniz.
davut.eryilmaz
Üye
Mesajlar: 2
Kayıt: 25 Eyl 2018 10:28

Re: Tcp server hakkında.

Mesaj gönderen davut.eryilmaz »

https://github.com/danieleteti/delphimvcframework kullanarak Rest Api geliştirmek iyi bir çözüm olabilir.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Tcp server hakkında.

Mesaj gönderen aegean »

Merhaba sayın arkadaşlar aradıgımda TCPserver olarak buldugum acılmıs konu bu oldugu için sorumu buradan sormak istedim. Ben Java ile yazılmış bir uygulamanın bana client oalrak bağlanması için bir Tcpserver ile dinleyen port acmam gerekiyor. ama karşı taraf bana bağlandıgında bana gondereceği verinin önüne '010000003B' gibi ilk iki karakteri mesaj başlangıç işareti sonraki iki karakteri mesaj içeriği (text, hex, Binary vb.) sonraki altı karakteri de hex olarak boyutu veren başlik ile geldiğini anladık bey gonderilen veri yapısını değiştirerek ona da aynı baslığa sahip olarak veri gonderice o program kabul etmeye başladı fakat ilemler başayınca benim server kısmı ondan gelen verileri parçalara bolmeye başladı . Bu da tabi verini butunluüunu bozukması ile işlemleri anlamsız kesilmesine programın kırılmasına yol actı. ben de cozum olarak TCPServer.Client.Read terigerinin altındaki işlemlerde bufferi okumadan önce 200 mili saniye kadar bekleme komutu verince verilei butun olarak okuyabilmeye başladık sanırım buffer a ilk veri girince triger atesleniyor fakat ben okuyana kadar karsı taraf verinin tamamını benim buffer a dolduramıyor. bunu da böyeli el yordamı ile cözdükten sonra son olarak simdi karsi program connection ı kapatıp veya kendini kapatınca index out of bound() error vermeye başladı. Kendi yazıdığım demo cliet ile bağalantda böyle bir hata vermiyor ama java ile yazılı orijinal program normal çalısıyor fakat program kapanıp baglantıyı kesince bu hatayı veriyor.
Özür dilerim çok uzun bir metin oldu ama bu şartlarda kulanabileceğim bir TCPserver ve karşıdan veriyi sağlıkla alabileceğim bir örnek için yardımcı olabilecek arkadaş varsa yardımlar için cok mutlu olacağım. Herkese kolay gelsin aşagıda veriyi almak için kullandıgım kodu veriyorum .

Kod: Tümünü seç

procedure TAnaForm.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  gel: string;
  gel1:string;
  I: integer;
  yer:integer;
begin
  gel:='';
  gel1:='';
  I:=0;

  while I<3 do begin
    sleep(200);
    gel:=socket.ReceiveText;
    gel1:=gel1+gel;
    if containstext(gel1,'</text>') then break;
    inc(I);
  end;

  gel:=gel1;

  yer:=pos('<?xml',gel)-1;

  gel:=rightstr(gel,length(gel)-yer);

  Memo1.Lines.Add(zaman+'  TCP Gelen veri : '+gel);
  GelenKontrol(gel , 'BPP');
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tcp server hakkında.

Mesaj gönderen freeman35 »

Formda global değişkenler kullanmayı dene.

Kod: Tümünü seç

IslemDurumu : Byte;
AlinanVeri: TStringList;
.......
IslemDurumu:= 0; //Boşta
IslemDurumu:= 1; //Alınıyor
IslemDurumu:= 2; //Tamamlandı;
......
procedure TAnaForm.ServerClientRead(Sender: TObject;  Socket: TCustomWinSocket);
..........
if (IslemDurumu<>1) and (containstext(gel1,'<text>') then IslemDurumu:= 1;

  while I<3 do begin
    gel:=socket.ReceiveText;
   AlinanVeri.Strings.Add(socket.ReceiveText);
    if containstext(gel1,'</text>') then begin
      IslemDurumu:= 3;
      break;
    end;
    inc(I);
  end;
IslemDurumu na görede bit timer eklersen, "</text>" gelene kadar parse etmeyi beklersin. Burda Idle kontrolünüde yapmakta fayda var, veri gelişi tamamlanmadan, yeni yada yeniden, baştan veri gelme ihtimalide var. Yani bu kontrolleride yapmanda fayda var. Donanımdan gelecek bilgilerle yapılan işlemlerde thread kullanılır hep unutmayın. ServerClientRead event i thread in içerisinden tetiklenir, o yüzdende düz program mantığından farklı kontroller yapmak gerek.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Tcp server hakkında.

Mesaj gönderen aegean »

Sayın freeman35
Verdiğiniz yanıt için cok tesekkür ederim derhal deneyeceğim. Aslında thread kontrolu ile serveri kullanmak istedim ama bilgim yetersiz geldi ve kontrolleri sağlayamadım örneğin karsıdan gelen verileri alamadım ve benzeri bazı sorunlar yasadım tcp konusunu henüz öğrenmeye başladım daha önce bu tür program yazmadım. Eğer bana thread olarak yapıyı kurmak için bazı örnekler verebilirseniz onu tekrar denemek istiyorum. Cunku programda karsı taraf baglantıyı kestiğinde bound error cok can sıkıcı error iletilerine ok demezseniz listenir calısmayı durduruyor. Bu verdiğiniz örneği deneyeceğim ama daha saglam olması için sanırım thread kullanmam gerek yola cıkabileceğim örnek ve bazı dikkat edeceğim ipucları verirebilirseniz sevinirim.
Ayrıca soylemem gerek ki ben bu programda 4 veya 5 tane tcp server port aynı anda kullanıyorum(her kontrol edilecek unite için bir uzak haberleşme için) ve bunun bir baska hizmet programında tek tcp server port var ve onda bu hataları almıyorum bu durumu da dikkate alırsanız başkaca tavsiyeleriniz olabilirmi? İyi calısmalar sağlıklı günler dilerim.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tcp server hakkında.

Mesaj gönderen freeman35 »

chat demolarını inceleyebilirsin, en basit örneklerdir. internette bolca mevcuttur. Indy bileşenlerini ve bunun demoları da öğretici olacaktır.

Threading için bu yazıyı inceleyebilirsin
http://www.tugrulhelvaci.com/?p=443
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Tcp server hakkında.

Mesaj gönderen aegean »

Tekrar merhaba ;
Ben yine bircok denemedien sonra anlamsız bir noktada tıkandım yazdıgım programda simdidlik 3 tane server listenir acılıyor onlarda sorun yok karsı uygulama ( onu ben yazmadım ona uymak zorundayım) baglanıyor ve onun gonderdiklerini her potdan dogru olarak okuyorum sonucta gelen bilgi veya komutu işledikten sonra iş cevabını vermeye gelince orada işler karısıyor. Ilk gelenler sorunsuz alınıyor ileniyor sunucları karsıya gidiyor ikinci gelenler işleniyor sonucları hazırlanıyor gonderliyor ama karsıda bos string gidiyor. ama benim gonderdiğim yerdeki log yazıcısı normal olması gereken veriyi yani gonderilen veriyi loga sorunsuz yazıyor yani ikinci msajları gonderiyorum ama karsıya nasıl oluyorsa bos gidiyor.

simdi buna gore programın formcreate bolumunde :

Kod: Tümünü seç

    //*******************
    serverI.Active:=false;
    serverI.Bindings.Clear;
    with serverI.Bindings.Add do
      begin
          IP   := sysip;
          Port := port1;
      end;
    with serverI.Bindings.Add do
      begin
          IP   := sysip;
          Port := port2;
      end;
    with serverI.Bindings.Add do
      begin
          IP   := sysip;
          Port := port3;
      end;
    serverI.Active:=True;
    serverI.StartListening;
    //*****************************


ile portları acıp dinlemeye baslıyoruz.(Idserver bu arada)
sonra gelen verileri serverexecute dan alıyoruz (sorunsuz alıyorum)

Kod: Tümünü seç

procedure TAnaForm.ServerIExecute(AContext: TIdContext);
var
  gel: string;
  gel1:string;
  yer:integer;
  cihaz: string;
  boyst :string;
  boy   :integer;
begin
  gel:='';
  gel1:='';
  cihaz:='';

if Acontext.Connection.Connected then begin
   try
     gel1:=Acontext.Connection.IOHandler.ReadString(10);
   except
     raise;
   end;

   boyst:=rightstr(gel1,8);

   try
       boy:=StrToInt('$' + boyst);
   except
       showmessage('hatalı sayı '+boyst);
       raise;
   end;

   try
      gel1:=Acontext.Connection.IOHandler.ReadString(boy);
   except
       raise;
   end;

end
else exit;

  case AContext.Binding.Port of
    17100: begin
       cihaz:='BIR';
    end;
    17200: begin
       cihaz:='IKI';
    end;
    17300: begin
       cihaz:='UC';
    end;
  end;

  if gel1='' then  begin
     if cihaz='BIR' then  L1Port('*****Veri Okunamadı*****');
     if cihaz='IKI' then  L2Port('*****Veri Okunamadı*****');
     if cihaz='UC'  then  L3Port('*****Veri Okunamadı*****');
     exit;
  end;

  gel:=trim(gel1);

  yer:=pos('<?xml',gel);

  if yer>1 then  gel:=rightstr(gel,length(gel)-yer+1)
  else if yer<1 then begin
     if cihaz='BIR' then  L1Port(' DIKKAT XML HATALI TCP Gelen :'+gel);
     if cihaz='IKI' then  L2Port(' DIKKAT XML HATALI TCP Gelen :'+gel);
     if cihaz='UC'  then  L3Port(' DIKKAT XML HATALI TCP Gelen :'+gel);

      exit;
  end;
 yer:=pos('</text>',gel);
  if (yer+7<length(gel)) and (yer>0) then gel:=leftstr(gel,yer+7)
  else if yer<1 then begin
     if cihaz='BIR' then  L1Port(' DIKKAT XML HATALI TCP Gelen :'+gel);
     if cihaz='IKI' then  L2Port(' DIKKAT XML HATALI TCP Gelen :'+gel);
     if cihaz='UC'  then  L3Port(' DIKKAT XML HATALI TCP Gelen :'+gel);
     exit;
  end;

  if cihaz='BIR' then  L1Port('BPP TCP Gelen PORT :'+inttostr(Acontext.Binding.Port)+#13#10+gel+#13#10);
  if cihaz='IKI' then  L2Port('BTP TCP Gelen PORT :'+inttostr(Acontext.Binding.Port)+#13#10+gel+#13#10);
  if cihaz='UC' then   L3Port('OCR TCP Gelen PORT :'+inttostr(Acontext.Binding.Port)+#13#10+gel+#13#10);
  
  GelenKontrol(gel , cihaz);

end;

işlemler yapıldıktan sonra da aynı portlara cevap veriyorum
burada bu fonsiyona gonderilecek string ile gonderilecek port numarasını gonderiyorum
Bu yapıda ılk gelenler alınıyor cevaplanıyor ikince gelenler alınıyor cecap veriyor ama karsıya cevap bos olarak gıdıyor
nerede hata oldugunu anlayamadım nerede hata yapıyorm veya bu yapıyı daha dogru nasıl kurarım tavsiyeye ihtiyacım var.
ilgilecek arkadaslara simdiden tesekkurler

Kod: Tümünü seç

function Tanaform.sendtcp(gel:string; gport:integer):boolean;
var
  clist  : Tlist;
   I  : integer;
begin
   result:=false;

    if assigned(serverI.Contexts) then begin
       clist:= serverI.Contexts.LockList;
       try
           for I := 0 to Clist.Count-1 do  begin
               if (TIdcontext(Clist[I]).Binding.Port=gport) then begin
                 TIdcontext(Clist[I]).Connection.IOHandler.WriteLn(gel);
                 result:=true;
               end;
           end;
       finally
          serverI.Contexts.UnlockList;
       end;
    end
    else begin
       result:=false;
    end;

end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Tcp server hakkında.

Mesaj gönderen freeman35 »

TIdcontext(Clist).Connection.IOHandler.WriteLn( ansisting(gel) );
Yada "gel" string değişkeni, ansiString olarak göndermeyi dene. Eskiden utf8 sorun çıkartıyordu. Birde alan tarafı sen yazmamışsın anladığım kadarıyla, ve hata stringten kaynaklı, String içeriğinde Türkçe karakter olunca mı sorun çıkartıyor kontrol et.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla