TServerSocket ve TClientSocket bileşenleri ile sorunum var

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
cLaW
Üye
Mesajlar: 46
Kayıt: 06 Eki 2008 02:16

TServerSocket ve TClientSocket bileşenleri ile sorunum var

Mesaj gönderen cLaW »

S.a cümleten

Delphi 2009 da 2 tane projem var Server ve Client uygulaması olarak
Windows 7 üzerinde geliştiriyorum projeleri Client uygulaması eğer Windows XP işletim sistemi üzerinde çalıştırılırsa belli bir süre sonra 10053 hata kodu vererek Server uygulamasından düşüyolar. Diğer işletim sistemlerine böyle bir sorun görülmüyor.

Bağlanan kullanıcılar TList bileşeninde

type
TAntiCheatData = record
isOK: Boolean;
Address, SteamID: string;
LastSignal, LastRequest: Cardinal;
Socket: TCustomWinSocket;
end;

bu record ile tutuluyor dinamik olarak oluşturup bilgileri doldurup adresi TListe yazdırıyorum her hangi bir işlem yapcağımda Address veya SteamID değerlerinden bu recordu bulup işlem yapıyorum bir sorun yok çalışma gereği Server - Clientlere check komutu gönderdiğinde clientler signal olarak tekrar servera dönüyor LastSignal ve LastRequest'te bunlara ait zaman değişkenleri Socket zaten kullanıcının bağlandığı socketi tutuyor isOK ise tüm bilgiler atandıktan sonra true oluyor eğer isOK değilse işlem yapılmıyor ve client düşürülüyor

10053 hata kodunun açıklaması gereği belki boş duran bağlantı kapatılıyordur deyip Client ve Server Arasında Ping - Pong ilişkisi kurdum 30 sn de bir birbirini pinglemekteler ama sorun hala aynı

Belli bir zaman sonra Server dan gönderilen check komutlarını client değerlendirmiyor sanki packet kaybı oluyormuş gibi cliente gitmiyor bu komut kodsal bir problem değil

Herhangi bir önerisi, görüşü, çözümü olan var mı ? Çok canımı sıktı bu sorun :?:
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: TServerSocket ve TClientSocket bileşenleri ile sorunum v

Mesaj gönderen G.Arkas »

Client server haberleşmesindeki toplu mesaj ve ping bölümünün kodunu paylaşırmısınız
Resim
cLaW
Üye
Mesajlar: 46
Kayıt: 06 Eki 2008 02:16

Re: TServerSocket ve TClientSocket bileşenleri ile sorunum v

Mesaj gönderen cLaW »

Kod: Tümünü seç

procedure TMainForm.ACSocketGot(readval: string; var Socket: TCustomWinSocket);
var
  Got, VersionGot, UsernameGot, PasswordGot, SteamID, ReadText: string;
  NowData: ^TAntiCheatData;
  NowPlayer: ^TAntiCheatPlayer;
  NowGameServer: ^TIRCBotGameServer;
  RP: TPerlRegEx;
  itmp: Integer;
  tmp1, tmp2: string;
begin
  if (readval[Length(readval)] = #10) then
    ReadText := Copy(readval, 0, Length(readval) - 1)
  else
    ReadText := readval;
  itmp := SF_StrPosition(#10, ReadText);
  if (itmp > 0) then begin
    tmp1 := Copy(ReadText, 0, itmp - 1);
    tmp2 := Copy(ReadText, itmp + 1, Length(ReadText) - itmp);
    ACSocketGot(tmp2, Socket);
    ReadText := tmp1;
  end;
  LogStatus('Read Text : '+ReadText, 'AC');
  if(SF_StrPosition('PING', ReadText) = 1) then begin
    LogStatus(Format('Ping request from %s', [Socket.RemoteAddress]), 'AC');
    ACSend(SF_StrReplaceOne(ReadText, 'PING', 'PONG'), Socket, False);
    LogStatus(Format('Pong answer to %s', [Socket.RemoteAddress]), 'AC');
    Exit;
  end;
  Got := AnsiString(DeCryptText(ReadText));
  LogStatus('Read Decrypted Text : '+Got, 'AC');
  if(SF_StrPosition('MyVersionIs(', Got) = 1) then begin
    RP := TPerlRegEx.Create;
    RP.Subject := Got;
    RP.RegEx := '(?i)MyVersionIs\(([0-9]*)\)/?';
    if(RP.Match) then begin
      VersionGot := RP.Groups[1];
      if(VersionGot = ACVersion) then begin
        ACSend('version_is_ok', Socket);
        NowData := FindACData(Socket.RemoteAddress, FAT_ACAddress);
        if(NowData <> nil) then begin
          NowData.isOK := True;
          NowData.Socket := Socket;
          Socket.ASyncStyles := [asRead, asWrite];
        end;
      end else begin
        ACSend('version_is_fail', Socket);
        NowData := FindACData(Socket.RemoteAddress, FAT_ACAddress);
        if(NowData <> nil) then begin
          NowData.isOK := False;
          NowData.Socket := nil;
        end;
      end;
    end;
    RP.Free;
    Exit;
  end;
.
.
.
.
.
.

diye devam ediyor

buda onClientRead olayı

procedure TMainForm.ACServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ACSocketGot(ParseSocketText(Socket), Socket);
end;

function TMainForm.ParseSocketText(var Socket: TCustomWinSocket): AnsiString;
begin
  SetLength(Result, Socket.ReceiveLength);
  SetLength(Result, Socket.ReceiveBuf(Pointer(Result)^, Length(Result)));
end;

Birşey farkettim check komutun gönderiyorum cliente gitmiyor sanki düşüyor fakat client PING gönderdiğinde sorunsuz bir şekilde geliyor 30 sn sonra felan tekrar check gönderdiğimde signal cevabı geliyor arada bir paket kaybı oluyormuş gibi işliyor sorun tabi PING sorunsuz geliyor ama gönderilen PONG cevabının gidip gitmediğini bilmiyorum kontrol ettirmediğim için check gitmediğine göre oda gitmiyodur diye düşünüyorum.
Kullanıcı avatarı
burak_489
Üye
Mesajlar: 31
Kayıt: 20 Ara 2010 09:20

Re: TServerSocket ve TClientSocket bileşenleri ile sorunum v

Mesaj gönderen burak_489 »

...
En son burak_489 tarafından 30 Nis 2011 08:32 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Delhici
Üye
Mesajlar: 176
Kayıt: 20 Eyl 2003 09:04

Re: TServerSocket ve TClientSocket bileşenleri ile sorunum v

Mesaj gönderen Delhici »

Eğer client ping mesajı gönderiyorda, server pong göndermiyorsa, client in servera bağlandığı connection id si değişiyordur. Bu yüzden serversocketin pong gönderdiği connection numarası yanlış olduğundan client e gitmiyordur. Benim şahsi kanaatimce sen clientsockette değilde serversockette cevabını ara.
http://www.bargem.info
Yaşıyorum..... İnadına değil yaptıklarım. Herşey istediğim için oluyor. İstediğim için türkü dinliyorum. İstediğim için çalışıyorum. İstediğim için yaşıyorum ve istediğim için seni seviyorum...
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: TServerSocket ve TClientSocket bileşenleri ile sorunum v

Mesaj gönderen m_ekici »

benim bir projemde bu hatayı aynı anda birden çok bağlantı yapıldığında veriyordu. Hataya düştüğünde de ekrana mesaj gelmesini engelleyebilirsin.

Kod: Tümünü seç

procedure TfMSMenu.MServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
 for i := 0 to MServer.Socket.ActiveConnections-1 do
    begin
    with MServer.Socket.Connections[i] do
         begin
         ........................
         end;
    end;
end;

Kod: Tümünü seç

procedure TfMSMenu.MServerClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
var I : Integer;
begin
for i := 0 To MServer.Socket.ActiveConnections -1 do
  Case ErrorCode of
  10061: ;
  10053: MServer.Socket.Connections[I].Close;
  end;
ErrorCode := 0; end;
Cevapla