Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Hole Punching Davası!
#1
Thumbs Up 
Herkese merhabalar;


Bu konu üzerinde güncellemeler yapılacağını bildirerek başlayayım isterseniz, sabit bir konu olması için. Angel 

 
 Ve şimdi... Benim çok fazla üstüne gittiğim ve bazı bilgilere ulaştığım konuya gelelim, "Port açmadan direkt iletişim" nam-ı değer "Hole Punching" şimdi ben bazı konular açtım;


Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol


Bu konulara baktığımızda biraz bilgi topladım gibi sizlerle o gelişmeleri paylaşayım. 

NOT: Henüz tam olarak bir proje çıkarabilmiş değilim.. Nedeni YöKS denilen ilett yüzünden pek vakit ayıramıyorum, verilen bilgiler ile proje çıkarıtırabilinirse burdan paylaşılması önemle rica edilir  Shy

Katkılarından dolayı;

   @savasabd
   @simaWB hocalarıma öncellikle teşekkürlerimi ileteyim.


Güncelleme - 1


 Hole punching için açtığım konuda @savasabd üstadından birkaç bilgi koparabildim.  Angel Şimdi onları paylaşayım;

Üstad kod satılarına gerekli düzenlemeyi yapmış, benim yorum yapmama gerek yok  Sleepy


program udpclient;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, Windows, WinSock;

const
TEXT : AnsiString = 'T';         // mesaj protokelleri gelen mesajın ne olduğunu anlamak için
CLIENT : AnsiString = 'C';

var
WSAData: TWSAData;                  //
sock : TSocket;
sr : TSockAddrIn; //serverin adresini portunu tutan yapı
cladr : TSockAddrIn; //clientlerin bilgilerini doldurcağımız yapı
cr : TSockAddrIn; //gelen verinin sahibi olan socketin bilgileri
gelenveri: Integer;
mesaj,yazilacakmesaj :AnsiString;
cSize : Integer;
Buffer : Array [0 .. 1023] of Byte;
cport : Word;
cip : AnsiString;
blok : integer;
bsize : integer;
count : integer;
ipler : array [0 .. 1] of AnsiString;
portlar : array [0 .. 1] of Word;

begin

blok := 1;
WinSock.WSAStartup($202, WSAData);
sock := WinSock.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);;    //socketi oluşturuyoruz
sr.sin_family := AF_INET;     //serverin adresini alan yapımızı yada recordumuzu dolduruyoruz
sr.sin_port := htons(Word(1762));
sr.sin_addr.S_addr := inet_addr(pAnsiChar('127.0.0.1'));     //local ip
ioctlsocket(sock, FIONBIO, blok);
WinSock.sendto(sock, PByte(pAnsiChar('br' ))^, 2, 0, sr, SizeOf(sr));//  bağlanmak için servere anlamsız bir bilgi gönderiyoruz
cSize := SizeOf(cr);
while True do
begin
      gelenveri := WinSock.recvfrom(sock, Buffer, 1024, 0, cr, cSize); //veri varsa alıyoruz ve kim olduğuna bakıyoruz
  if gelenveri > 0 then
  begin
    cip := inet_ntoa(cr.sin_addr);//veriyi göderen ip ve portu tespit ediyoruz
    cport := ntohs(cr.sin_port);
    Writeln(cip+' ip, '+IntToStr(cport)+ ' portlu birinden mesaj geldi.');
    mesaj := TEncoding.UTF8.GetString(Buffer);;     //veriyi stringe çeviriyoruz
    if mesaj[1]=CLIENT then  //ilk karaktere bakıyoruz mesaj ne için gönderilmiş diye
    begin                      //eğer client ise bize bir clientin bilgileri gelmiştir
      ipler[0] :=  Copy(mesaj, 2, 9);
      portlar[0] := StrToInt(Copy(mesaj, 11, 5));;
      cladr.sin_family := AF_INET;
      cladr.sin_port := htons(portlar[0]);
      cladr.sin_addr.S_addr := inet_addr(pAnsiChar(ipler[0]));  //bu bilgilerle yapımızı doldurup doğrudan cliente mesaj atıyoruz
      WinSock.sendto(sock, PByte(PAnsiChar('TMerhaba'))^, 8, 0, cladr, SizeOf(cladr));
    end
    else    //eğer text mesajı ise mesajı yazdırıyoruz çünkü bu clientten geldi
    begin
         yazilacakmesaj := Copy(mesaj, 2, gelenveri-1);
          Writeln('mesaj : '+yazilacakmesaj);
    end;

  end;

  Sleep(1);
end;
 closesocket(sock);
  WinSock.WSACleanup;     //temizlik yapıyoruz

end.



Bu client bölümünde aşağıdaki kısımda hata alıyorsanız, bu fonksiyonu kullanabilirsiniz;

Hata alınan kısım:

 mesaj := TEncoding.UTF8.GetString(Buffer);;     //veriyi stringe çeviriyoruz

Kullanılacak Fonksiyon:


function ByteToString(var Value: array of Byte;cnt:Integer): String;
var
I: integer;
S : String;
Letra: char;
begin
S := '';
for I := cnt-1 Downto 0 do
begin
letra := Chr(Value[I]);
S := letra + S;
end;
Result := S;
end;




Server kısmı ise;


program udpserver;

{$APPTYPE CONSOLE}
{$R *.res}

uses
System.SysUtils, Windows, WinSock;

const
TEXT: AnsiString = 'T';
// mesaj protokelleri gelen mesajın ne olduğunu anlamak için
CLIENT: AnsiString = 'C';

var
WSAData: TWSAData;
sock: TSocket;
sr: TSockAddrIn; // serverin adresini portunu tutan yapı
cladr: TSockAddrIn; // clientlerin bilgilerini doldurcağımız yapı
cr: TSockAddrIn; // gelen verinin sahibi olan socketin bilgileri
gelenveri: Integer;

cSize : Integer;
Buffer : Array [0 .. 1023] of Byte;
cport  : Word;
cip, gmesaj: AnsiString;
blok : integer;
bsize : integer;
count : integer;
ipler : array [0 .. 1] of AnsiString; // client bilgileri için
portlar : array [0 .. 1] of Word;

begin
WinSock.WSAStartup($202, WSAData);
blok := 1;
count := 0;
sock := WinSock.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);;
sr.sin_family := AF_INET;
sr.sin_port := htons(Word(1762));
sr.sin_addr.S_addr := INADDR_ANY;
ioctlsocket(sock, FIONBIO, blok);
WinSock.bind(sock, sr, SizeOf(sr)); // socketi bind edip bağlantı bekliyoruz
cSize := SizeOf(cr);
while True do
begin
  gelenveri := WinSock.recvfrom(sock, Buffer[0], 1024, 0, cr, cSize);
  // gelen veri var mı bağlanan var mı diye bakıyoruz
  if gelenveri > 0 then
  begin
    cip := inet_ntoa(cr.sin_addr);
    cport := ntohs(cr.sin_port);
    Writeln(cip + ' ip, ' + IntToStr(cport) + ' portla biri bağlandı');
    // bağlananın bilgilerini alıyoruz
    inc(count);

    if count < 2 then // henüz iki değilse bilgiyi saklıyoruz
    begin
      ipler[0] := cip; // ip bilgisi
      portlar[0] := cport; // port bilgisi
    end
    else
    begin
      // artık iki clientimiz var bilgilerini birbirlerine gönderiyoruz
      cladr.sin_family := AF_INET;
      cladr.sin_port := htons(cport);
      cladr.sin_addr.S_addr := inet_addr(pAnsiChar(cip));
      gmesaj := CLIENT + ipler[0] + IntToStr(portlar[0]);
      WinSock.sendto(sock, PByte(pAnsiChar(gmesaj))^, 15, 0, cladr,
        SizeOf(cladr));
      cladr.sin_family := AF_INET;
      cladr.sin_port := htons(portlar[0]);
      cladr.sin_addr.S_addr := inet_addr(pAnsiChar(ipler[0]));
      gmesaj := CLIENT + cip + IntToStr(cport);
      WinSock.sendto(sock, PByte(pAnsiChar(gmesaj))^, 15, 0, cladr,
        SizeOf(cladr));

    end;

  end;

  Sleep(1);
end;
closesocket(sock);
WinSock.WSACleanup;


end.





Bu kodlar ile denemelerim;

6yD8E3.png
6yD8E36yD8E3

Görüldüğü üzere clientler birbirleri ile iletişime geçebiliyorlar. (Uzaktan yapma imkanım daha doğrusu zamanım olmadı  Angry )



Koddan da anlaşılacağı üzere, iletişime geçilmeden önce saçma bir veri göndererek doğrulama işlemi yapılıyor. Şimdilik buna


BAŞARILI!

Diyebiliriz!  Big Grin


İlginç bir proje  Huh


Şimdi gelelim, benim araştırma isteğim bitmemesine ve yeni bir şeyler bulduğumu söylememe. Bir proje dosyası buldum fakat birazcık ilginçime gitti desem yeridir. Çünkü server açıldıktan sonra client açtığım an server ve client aynı anda kapanıyor. Yani bu da ikisi arasında bir iletişim olduğunun göstergesidir.

Sherlock%20Holmes%20Basil%20Rathbone%20baskervilles.jpg

   Tamam biraz abartmış olabilirim  Big Grin



Bu projeyi bir Türk geliştiricinin yaptığını header kısmında ki verisi bozulmuş "zhan" yazısından anlayabiliyorum, direkt sizinle alt tarafta projeyi paylaşıyorum.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol


Bir .pas dosyası hikayesi!


Evet, bir .pas dosyası buldum hemen aldım projeye enjekte ettim;

-> kütüphane tanımlandı.
-> değişkenler tanımlandı.

Derledim hemen ama nasıl mutluyum sizlere anlatamam  Rolleyes dosyada bulunan;

Listen, connect gibi değişkenleri kullanarak hemen kodu yazdım, sonuç;

o6dZ5k.png


 Şaşırmadım, çünkü ben bir Delphi kullanıcısıyım  Sleepy


Hemen bu dosyasının kodlarını(pürüzler vardı giderdim) paylaşayım;

{
 Delphi Winsock 1.1 Library by Aphex
}

unit HoleHole;

interface

uses Windows, Winsock;

type
 TTransferCallback = procedure(BytesTotal: dword; BytesDone: dword);

 TClientSocket = class(TObject)
 private
   FAddress: pchar;
   FData: pointer;
   FTag: integer;
   FConnected: boolean;
   function GetLocalAddress: string;
   function GetLocalPort: integer;
   function GetRemoteAddress: string;
   function GetRemotePort: integer;
 protected
   FSocket: TSocket;
 public
   procedure Connect(Address: string; Port: integer);
   property Connected: boolean read FConnected;
   property Data: pointer read FData write FData;
   destructor Destroy; override;
   procedure Disconnect;
   function Idle(Seconds: integer): Boolean;
   property LocalAddress: string read GetLocalAddress;
   property LocalPort: integer read GetLocalPort;
   function ReceiveBuffer(var Buffer; BufferSize: integer): integer;
   procedure ReceiveFile(FileName: string; TransferCallback: TTransferCallback);
   function ReceiveLength: integer;
   function ReceiveString: string;
   property RemoteAddress: string read GetRemoteAddress;
   property RemotePort: integer read GetRemotePort;
   function SendBuffer(var Buffer; BufferSize: integer): integer;
   procedure SendFile(FileName: string; TransferCallback: TTransferCallback);
   function SendString(const Buffer: string): integer;
   property Socket: TSocket read FSocket;
   property Tag: integer read FTag write FTag;
 end;

 TServerSocket = class(TObject)
 private
   FListening: boolean;
   function GetLocalAddress: string;
   function GetLocalPort: integer;
 protected
   FSocket: TSocket;
 public
   function Accept: TClientSocket;
   destructor Destroy; override;
   procedure Disconnect;
   procedure Idle;
   procedure Listen(Port: integer);
   property Listening: boolean read FListening;
   property LocalAddress: string read GetLocalAddress;
   property LocalPort: integer read GetLocalPort;
 end;

var
 WSAData: TWSAData;

implementation

procedure TClientSocket.Connect(Address: string; Port: integer);
var
 SockAddrIn: TSockAddrIn;
 HostEnt: PHostEnt;
begin
 Disconnect;
 FAddress := pchar(Address);
 FSocket := Winsock.socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 SockAddrIn.sin_family := AF_INET;
 SockAddrIn.sin_port := htons(Port);
 SockAddrIn.sin_addr.s_addr := inet_addr(PansiChar(FAddress));
 if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
 begin
   HostEnt := gethostbyname(PansiChar(FAddress));
   if HostEnt = nil then
   begin
     Exit;
   end;
   SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
 end;
 Winsock.Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn));
 FConnected := True;
end;

procedure TClientSocket.Disconnect;
begin
 closesocket(FSocket);
 FConnected := False;
end;

function TClientSocket.GetLocalAddress: string;
var
 SockAddrIn: TSockAddrIn;
 Size: integer;
begin
 Size := sizeof(SockAddrIn);
 getsockname(FSocket, SockAddrIn, Size);
 Result := inet_ntoa(SockAddrIn.sin_addr);
end;

function TClientSocket.GetLocalPort: integer;
var
 SockAddrIn: TSockAddrIn;
 Size: Integer;
begin
 Size := sizeof(SockAddrIn);
 getsockname(FSocket, SockAddrIn, Size);
 Result := ntohs(SockAddrIn.sin_port);
end;

function TClientSocket.GetRemoteAddress: string;
var
 SockAddrIn: TSockAddrIn;
 Size: Integer;
begin
 Size := sizeof(SockAddrIn);
 getpeername(FSocket, SockAddrIn, Size);
 Result := inet_ntoa(SockAddrIn.sin_addr);
end;

function TClientSocket.GetRemotePort: integer;
var
 SockAddrIn: TSockAddrIn;
 Size: Integer;
begin
 Size := sizeof(SockAddrIn);
 getpeername(FSocket, SockAddrIn, Size);
 Result := ntohs(SockAddrIn.sin_port);
end;

function TClientSocket.Idle(Seconds: integer): Boolean;
var
 FDset: TFDset;
 TimeVal: TTimeVal;
begin
 if Seconds = 0 then
 begin
   FD_ZERO(FDSet);
   FD_SET(FSocket, FDSet);
   Result := select(0, @FDset, nil, nil, nil) > 0;
 end
 else
 begin
   TimeVal.tv_sec := Seconds;
   TimeVal.tv_usec := 0;
   FD_ZERO(FDSet);
   FD_SET(FSocket, FDSet);
   Result := select(0, @FDset, nil, nil, @TimeVal) > 0;
 end;
end;

function TClientSocket.ReceiveLength: integer;
begin
 Result := ReceiveBuffer(pointer(nil)^, -1);
end;

function TClientSocket.ReceiveBuffer(var Buffer; BufferSize: integer): integer;
begin
 if BufferSize = -1 then
 begin
   if ioctlsocket(FSocket, FIONREAD, Longint(Result)) = SOCKET_ERROR then
   begin
     Result := SOCKET_ERROR;
     Disconnect;
   end;
 end
 else
 begin
    Result := recv(FSocket, Buffer, BufferSize, 0);
    if Result = 0 then
    begin
      Disconnect;
    end;
    if Result = SOCKET_ERROR then
    begin
      Result := WSAGetLastError;
      if Result = WSAEWOULDBLOCK then
      begin
        Result := 0;
      end
      else
      begin
        Disconnect;
      end;
    end;
 end;
end;

function TClientSocket.ReceiveString: string;
begin
 SetLength(Result, ReceiveBuffer(pointer(nil)^, -1));
 SetLength(Result, ReceiveBuffer(pointer(Result)^, Length(Result)));
end;

procedure TClientSocket.ReceiveFile(FileName: string; TransferCallback: TTransferCallback);
var
 BinaryBuffer: pchar;
 BinaryFile: THandle;
 BinaryFileSize, BytesReceived, BytesWritten, BytesDone: dword;
begin
 BytesDone := 0;
 BinaryFile := CreateFile(pchar(FileName), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 Idle(0);
 ReceiveBuffer(BinaryFileSize, sizeof(BinaryFileSize));
 while BytesDone < BinaryFileSize do
 begin
   Sleep(1);
   BytesReceived := ReceiveLength;
   if BytesReceived > 0 then
   begin
     GetMem(BinaryBuffer, BytesReceived);
     try
       ReceiveBuffer(BinaryBuffer^, BytesReceived);
       WriteFile(BinaryFile, BinaryBuffer^, BytesReceived, BytesWritten, nil);
       Inc(BytesDone, BytesReceived);
       if Assigned(TransferCallback) then TransferCallback(BinaryFileSize, BytesDone);
     finally
       FreeMem(BinaryBuffer);
     end;
   end;
 end;
 CloseHandle(BinaryFile);
end;

procedure TClientSocket.SendFile(FileName: string; TransferCallback: TTransferCallback);
var
 BinaryFile: THandle;
 BinaryBuffer: pchar;
 BinaryFileSize, BytesRead, BytesDone: dword;
begin
 BytesDone := 0;
 BinaryFile := CreateFile(pchar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 BinaryFileSize := GetFileSize(BinaryFile, nil);
 SendBuffer(BinaryFileSize, sizeof(BinaryFileSize));
 GetMem(BinaryBuffer, 2048);
 try
   repeat
     Sleep(1);
     ReadFile(BinaryFile, BinaryBuffer^, 2048, BytesRead, nil);
     Inc(BytesDone, BytesRead);
     repeat
       Sleep(1);
     until SendBuffer(BinaryBuffer^, BytesRead) <> -1;
     if Assigned(TransferCallback) then TransferCallback(BinaryFileSize, BytesDone);
   until BytesRead < 2048;
 finally
   FreeMem(BinaryBuffer);
 end;
 CloseHandle(BinaryFile);
end;

function TClientSocket.SendBuffer(var Buffer; BufferSize: integer): integer;
var
 ErrorCode: integer;
begin
 Result := send(FSocket, Buffer, BufferSize, 0);
 if Result = SOCKET_ERROR then
 begin
   ErrorCode := WSAGetLastError;
   if (ErrorCode = WSAEWOULDBLOCK) then
   begin
     Result := -1;
   end
   else
   begin
     Disconnect;
   end;
 end;
end;

function TClientSocket.SendString(const Buffer: string): integer;
begin
 Result := SendBuffer(pointer(Buffer)^, Length(Buffer));
end;

destructor TClientSocket.Destroy;
begin
 inherited Destroy;
 Disconnect;
end;

procedure TServerSocket.Listen(Port: integer);
var
 SockAddrIn: TSockAddrIn;
begin
 Disconnect;
 FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 SockAddrIn.sin_family := AF_INET;
 SockAddrIn.sin_addr.s_addr := INADDR_ANY;
 SockAddrIn.sin_port := htons(Port);
 bind(FSocket, SockAddrIn, sizeof(SockAddrIn));
 FListening := True;
 Winsock.listen(FSocket, 5);
end;

function TServerSocket.GetLocalAddress: string;
var
 SockAddrIn: TSockAddrIn;
 Size: integer;
begin
 Size := sizeof(SockAddrIn);
 getsockname(FSocket, SockAddrIn, Size);
 Result := inet_ntoa(SockAddrIn.sin_addr);
end;

function TServerSocket.GetLocalPort: integer;
var
 SockAddrIn: TSockAddrIn;
 Size: Integer;
begin
 Size := sizeof(SockAddrIn);
 getsockname(FSocket, SockAddrIn, Size);
 Result := ntohs(SockAddrIn.sin_port);
end;

procedure TServerSocket.Idle;
var
 FDset: TFDset;
begin
 FD_ZERO(FDSet);
 FD_SET(FSocket, FDSet);
 select(0, @FDset, nil, nil, nil);
end;

function TServerSocket.Accept: TClientSocket;
var
 Size: integer;
 SockAddr: TSockAddr;
begin
 Result := TClientSocket.Create;
 Size := sizeof(TSockAddr);
 Result.FSocket := Winsock.accept(FSocket, @SockAddr, @Size);
 if Result.FSocket = INVALID_SOCKET then
 begin
   Disconnect;
 end
 else
 begin
   Result.FConnected := True;
 end;
end;

procedure TServerSocket.Disconnect;
begin
 FListening := False;
 closesocket(FSocket);
end;

destructor TServerSocket.Destroy;
begin
 inherited Destroy;
 Disconnect;
end;

initialization
 WSAStartUp(257, WSAData);

finalization
 WSACleanup;

end.


 @savasabd hocanın vermiş olduğu kodlar çalıştı diyebiliriz ama benim vaktim dar olduğundan uzak ağ için deneme imkanım olmadı pek  Sleepy

 -Zaten bu yazıyı da yazmak için gözlerim yerinden çıkacak adeta  Big Grin


Gelelim sonucumuza;


Baya bir yol katettim gibi, sizlerinde bulmuş olduğu ordan burdan bir kaynaklar ile çok profesyonel işler çıkabileceği kanaatindeyim.


Bir diğer güncellemede görüşmek üzere,


Saygılarımla,
Halil Han Badem.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#2
Klavyenize sağlık Hyper Bey belli ki çok uğraşmışsınız...
WWW
Cevapla
#3
(06-11-2017, Saat: 00:41)Hashshashin Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlKlavyenize sağlık Hyper Bey belli ki çok uğraşmışsınız...

 Teşekkürler.. Biraz öyle oldu Smile
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#4
Az bilinen (en azından kendim için Smile) bir konu hakkında katkılarınız için teşekkürler.
Cevapla
#5
(06-11-2017, Saat: 08:47)frmman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAz bilinen (en azından kendim için Smile) bir konu hakkında katkılarınız için teşekkürler.

Rica ederim hocam, bu konunun artık kolaya kavuşması temennimiz  Blush
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#6
Paylaşım için teşekkürler. Devamı bekleriz Smile
There's no place like 127.0.0.1
WWW
Cevapla
#7
(05-11-2017, Saat: 23:46)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olo6dZ5k.png

 Şaşırmadım, çünkü ben bir Delphi kullanıcısıyım  Sleepy

Şaşırdım, çünkü ben de bir Delphi programcısıyım !
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
(06-11-2017, Saat: 11:44)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(05-11-2017, Saat: 23:46)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olo6dZ5k.png
 Şaşırmadım, çünkü ben bir Delphi kullanıcısıyım  Sleepy

Şaşırdım, çünkü ben de bir Delphi programcısıyım !

 Siz üstatsınız ben acemi üstadım, fark bu yüzden Shy
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#9
(06-11-2017, Saat: 12:31)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(06-11-2017, Saat: 11:44)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlŞaşırdım, çünkü ben de bir Delphi programcısıyım !

 Siz üstatsınız ben acemi üstadım, fark bu yüzden Shy

Estağfirullah, vurgulamak istediğim o değildi. Garibim Delphi'ye yüklemeyin bu tarz AV hatalarını demek istemiştim Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#10
(06-11-2017, Saat: 16:21)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(06-11-2017, Saat: 12:31)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol Siz üstatsınız ben acemi üstadım, fark bu yüzden Shy

Estağfirullah, vurgulamak istediğim o değildi. Garibim Delphi'ye yüklemeyin bu tarz AV hatalarını demek istemiştim Wink

 Yok hocam, Delphi candır, sadece Delphi'ye has bir hata olduğu için söylemiştim Smile
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi