TCPIP Indy Server hakkında yardım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

TCPIP Indy Server hakkında yardım

Mesaj gönderen adelphiforumz »

S.A.

Delphi 2007 içerisinden çıkan indy TIdTCPServer componentini kullanarak bir uygulama yapmaya çalışıyorum.
2 adet sorunla karşılaştım. 1 tanesini çözdüm fakat yaptığım işin doğrumu olduğunu tam olarak bilmiyorum.

1.Server ile bağlantıyı kesmek istediğimde program TCPServer.Active := False; işleminden sonra program donup kalıyor
çalıştırdığım kod aşağıda bunun nedeni ne olabilir.

2. Eğer ben bağlanan bir cliente server üzerindeki Context üzerinden ulaşıp bilgi gönderirsem
"( TIDContext(TCPServer.Contexts.LockList.Items[0]).Connection.Socket.WriteLn(SendData); )"
yada bir kontrol yapmaya kalkarsam
" ( if TIDContext(TCPServer.Contexts.LockList.Items).Binding.PeerIP = 'xxx.xxx.xxx.xxx' ) "
program bu noktada kilitleniyordu indy componentlerinden IdAntiFreeze componentini form üzerine koyduğumda 2 maddedeki kilitlenme olayı çözüldü
fakat halen 1. maddedeki kilitlenme devam ediyor nedenini bulamadım.

yardımlarınız için teşekkürler.

Kod: Tümünü seç

procedure TForm3.BtnServerKesClick(Sender: TObject);
var
  Cont:TIdContext;
  i:integer;
begin
    for i:=TCPServer.Contexts.LockList.Count-1 downto 0 do
    begin
      Cont:=TIdContext(TCPServer.Contexts.LockList.Items[i]);
      Cont.Connection.Disconnect;
    end;
    TCPServer.Contexts.Clear;
    TCPServer.Contexts.UnLockList;
    TCPServer.Active := False;
    ShowMessage('Bağlantı Kesildi');
end;
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: TCPIP Indy Server hakkında yardım

Mesaj gönderen orhancc »

Sen serveri mi kapatmak istiyorsun yoksa bağlanan istemciyi mi ?

Kod: Tümünü seç

 IdTCPServer1.StopListening;
bununla dinlemeyi durdurabilirsin.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: TCPIP Indy Server hakkında yardım

Mesaj gönderen adelphiforumz »

S.A.

Server'a bağlı olan 5 adet client olsun ben bunlarda 1 tanesini disconnect etmek istiyorum
öncelikle amacım bu fakat dün bazı testleri yaparken şunu farkettim
eğer server tarafından bir cliente disconnect gönderilirse yada serverın context özelliklerinde bir sorgu yapılırsa
Server artık accept yada listening yapmıyor ve hiç bir client bağlantısını kabul etmiyor.

Bu konuda yardımcı olabilecek arkadaşlara teşekkür ederim.
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: TCPIP Indy Server hakkında yardım

Mesaj gönderen neu84 »

adelphiforumz yazdı:S.A.

Server'a bağlı olan 5 adet client olsun ben bunlarda 1 tanesini disconnect etmek istiyorum
öncelikle amacım bu fakat dün bazı testleri yaparken şunu farkettim
eğer server tarafından bir cliente disconnect gönderilirse yada serverın context özelliklerinde bir sorgu yapılırsa
Server artık accept yada listening yapmıyor ve hiç bir client bağlantısını kabul etmiyor.

Bu konuda yardımcı olabilecek arkadaşlara teşekkür ederim.

Slm. Size önerim şu olabilir, bağlı olan clientların hangisi koparmak istiyorsanız ona bi karakter yollayın, OnRead eventında gelen veri bu karaktermi diyerek bi kontrol yapın, öyleyse eger client kendi bağlantısını kendi koparsın socket i false yaparak.. bağlantı kopunca client tekrar servera bağlanabiliyor. aklıma gelen şimdilik bi tek bu var.. umarım işinizi görür.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: TCPIP Indy Server hakkında yardım

Mesaj gönderen adelphiforumz »

Yukarıdaki sorunuma şimdilik şöyle bir çözüm bulabildim.

fakat doğruluğundan %100 emin değilim fakat şu anda çalışıyor gibi görünüyor.

Kod: Tümünü seç

procedure TForm1Control.pDisconnect(pIP:String);
var
  I:Integer;
  Cont:TIdContext;
begin
  TCPServer.Contexts.UnLockList;
  for I := 0 to (TCPServer.Contexts.LockList.Count - 1) do
  begin
    Cont:=TIdContext(TCPServer.Contexts.LockList.Items[i]);
    if pIP <> 'ALL' then
      if Cont.Binding.PeerIP <> pIP then Continue;
    Cont.Connection.Disconnect;
    //Cont.Free;
    Cont.Data := nil;
    if pIP <> 'ALL' then Break;
  end;
  if pIP = 'ALL' then
    TCPServer.Contexts.Clear;
  TCPServer.Contexts.UnLockList;
end;
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Cevapla