Domain'e alınmış bilgisayarın ipsini alma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Javs
Üye
Mesajlar: 32
Kayıt: 16 Eyl 2014 02:45

Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen Javs »

Merhaba arkadaşlar okulun bitirme projesi olarak teknik ofis elemanları için bir proje geliştirmiştim uzaktan yardım projesi teamviewer'a benzetmeye çalıştım benzedi de kendi local ağımda yani şöyle söylim kendi bilgisayarıma VMware ile sanal bir xp kurdum sanal bilgisayarıma ulaşabiliyorum 192.168.x.x iplerini alıyor fakat okulda projeyi sunmak istediğimde okulun domaininde olan bilgisayarlarda hep aynı ip'yi alıyordu (Projeyi Sunarken ki halimi sormayın bişiler başarabilmenin verdiği grur ile gidip programda bug çıkması resmen yüzüm düşmüştü :))) aldığı ip 192.168.1.116 veya 192.168.116.1 di sanırım tam hatırlamıyorum sorun ne olabilir kullandığım fonksiyonu aşağıya yazıyorum. okuldaki bilgisayarlar 72 ile başlayan bir ip alıyordu.

Kod: Tümünü seç

  function DetectHostIP(var IP: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
    gethostname (hostName, sizeof (hostName));
    hostEnt := gethostbyname (hostName);
    if Assigned (hostEnt) then
      if Assigned (hostEnt^.h_addr_list) then begin
        addr := hostEnt^.h_addr_list^;
        if Assigned (addr) then begin
          IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
          byte (addr [1]), byte (addr [2]), byte (addr [3])]);
          Result := True;
        end
        else
          Result := False;
      end
      else
        Result := False
    else begin
      Result := False;
    end;
finally
    WSACleanup;
end
end;
Kullanıcı avatarı
mia
Üye
Mesajlar: 239
Kayıt: 17 Nis 2015 02:18

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen mia »

i didnt understand very good the problem but i see this winsock code is not compatible with newer delphi version

here is fixed one

Kod: Tümünü seç

implementation
uses Winsock;

{$R *.dfm}

function DetectHostIP(var IP: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of AnsiChar;
hostEnt : PHostEnt;
addr : PAnsiChar;
begin
WSAStartup ($0101, wsdata);
try
    gethostname (hostName, sizeof (hostName));
    hostEnt := gethostbyname (hostName);
    if Assigned (hostEnt) then
      if Assigned (hostEnt^.h_addr_list) then begin
        addr := hostEnt^.h_addr_list^;
        if Assigned (addr) then begin
          IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
          byte (addr [1]), byte (addr [2]), byte (addr [3])]);
          Result := True;
        end
        else
          Result := False;
      end
      else
        Result := False
    else begin
      Result := False;
    end;
finally
    WSACleanup;
end
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ip :string;
begin
ip := '0.0.0.0;
if DetectHostIP(ip) = true then
showmessage(IP);
end;
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
in god i trust with every movement i do
graduated student and looking for knowledge
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen xozcanx »

Merhaba;
Konu ilgimi çektiği için kodları denedim. Windows8 de sonuç '192.168.XX.X' iken Windows Xp de sonuç '199.XXX.XXX.XXX' şeklinde.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
Javs
Üye
Mesajlar: 32
Kayıt: 16 Eyl 2014 02:45

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen Javs »

Windows 8 ile ilgili bir sorun mu acaba diyicem xp de 199 la başlayan bir ip aldı dediniz garip fonksiyonda bir sorun var sanırım farklı bir fonksiyon deneyim bakalım
true_false
Üye
Mesajlar: 401
Kayıt: 22 Tem 2004 02:03
Konum: sıkıntı çekmişlere yakın bi yerden

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen true_false »

ip v6 yı kapatıp denedinmi
type
Tform1 = class(Tform)
Kullanıcı avatarı
Javs
Üye
Mesajlar: 32
Kayıt: 16 Eyl 2014 02:45

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen Javs »

true_false yazdı:ip v6 yı kapatıp denedinmi
ip v6 kullanılmıyordu bilgisayarlarda yinede kapatmak için bir işlem yapmak gerekiyormu bilmiyorum işin garip tarafı fonksiyonu evdeki bilgisayarımda sorunsuz kullanıyordum okuldaki okulun ağına alınmış bilgisayarlarda local ip yi almadı.
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen xozcanx »

Merhaba;
Kendi Kullandiğim Function Aşağıdaki şekilde ve ben burada doğru sonuç alıyorum birde bunu deneyin,

Kod: Tümünü seç

Uses Winsock;
function LocalIP : String;
type
  TArrayPInAddr = array [0..10] of PInAddr;
  PArrayPInAddr = ^ TArrayPInAddr;
var
  phe      : PHostEnt;
  pptr     : PArrayPInAddr;
  Buffer   : array [0..63] of Ansichar;
  i        : integer;
  GInitData: TWSADATA;
begin
  WSAStartup($101, GInitData);
  result := '';
  GetHostName(Buffer, sizeof(Buffer));
  phe := GetHostByName(Buffer);
  if phe=nil then
  begin
    exit
  end;
  pptr := PArrayPInAddr(phe^.h_addr_list);
  i := 0;
  while pptr^[i]<>nil do
  begin
    result := StrPas(inet_ntoa(pptr^[i]^));
    Inc(i);
  end;
  WSACleanup;
end;
Kullanımı

Kod: Tümünü seç

Showmessage(LocalIP)
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen SimaWB »

Eğer unicode destekli bir Delphi versiyonu kullanıyorsanız (Delphi 2009 ve sonrası) yazdığınız kodda hata almanız normal.
Aslında mia sorunun kaynağını göstermiş size.
There's no place like 127.0.0.1
Kullanıcı avatarı
Javs
Üye
Mesajlar: 32
Kayıt: 16 Eyl 2014 02:45

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen Javs »

SimaWB yazdı:Eğer unicode destekli bir Delphi versiyonu kullanıyorsanız (Delphi 2009 ve sonrası) yazdığınız kodda hata almanız normal.
Aslında mia sorunun kaynağını göstermiş size.
Hocam ben sorunun kaynağını hala anlamış değilim "Delphi 2009 ve sonrası" demişsiniz ama ben Delphi 7 ile derleme yaptım(Delphi 7 nin de 2009 ve sonrası bir derleyici olmadığını düşünerek yazdım) mia nickli arkadaşımız sorunun kaynağını göstermiş demiştiniz ip değişkenine '0.0.0.0; bu değer atandığında nasıl bir anlam ifade ediyorki benim yaşadığım sorunu gideriyor.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen SimaWB »

Delphi 7 kullanıyorsanız sorunun kaynağı farklı demektir. Vakit bulabilirsem gün içinde deneme yapacağım.
There's no place like 127.0.0.1
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen xxxjedixxx »

Merhaba,

Sorun bence PC'de birden fazla IP adresinin olmasından kaynaklanıyor. Örneğin ethernet ve wifi aynı anda bağlı ise ve Virtualbox da kurulu ise host adapter ip'si ile birlikte sistemde 3 tane IP adresi olacaktır. Senin yazdığın kod ise sadece ilk bulduğu IP adresini getirir. Yazdığın kod üzerinde ufak bir değişiklik yaptım ve denedim. Delphi 7 ile kendi sistemimdeki 3 tane IP adresini alabiliyorum. Kolay gelsin.

Kod: Tümünü seç

function DetectHostIP(var pIP: TStrings): Boolean;
var wsdata : TWSAData;
    hostName : array [0..255] of char;
    hostEnt : PHostEnt;
    addr : PChar;
begin
  Result := False;
  if pIp = nil then Exit;
  pIP.Clear;

  WSAStartup ($0101, wsdata);
  try
    gethostname (hostName, sizeof (hostName));
    hostEnt := gethostbyname (hostName);
    if not Assigned (hostEnt) then Exit;
    if not Assigned (hostEnt^.h_addr_list) then Exit;

    addr := hostEnt^.h_addr_list^;
    while Assigned(addr) do
    begin
      Result := True;
      pIP.Add(Format ('%d.%d.%d.%d', [byte (addr[0]), byte (addr[1]),
                                     byte (addr[2]), byte (addr[3])]));
      Inc(hostEnt^.h_addr_list);
      addr := hostEnt^.h_addr_list^;
    end;
  finally
    WSACleanup;
  end
end;

procedure TForm1.Button1Click(Sender: TObject);
var Ip: TStrings;
begin
  Ip := TStringList.Create;
  if DetectHostIP(ip) then
    memo1.text := ip.text;
end;

Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen SimaWB »

Küçük bir hatırlatma:
Ip değişkeni (Ip: TStrings;) kod bloğunun sonunda Free edilmeli
There's no place like 127.0.0.1
Kullanıcı avatarı
Javs
Üye
Mesajlar: 32
Kayıt: 16 Eyl 2014 02:45

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen Javs »

evet PC de kesinlikle birden fazla ip adresi var fakat kafama takılan birkaç soru var neden tüm PC lerde Aynı ip adresini alıyor (192.168.1.116 veya 192.168.116.1) bu ikisinden biri hadi onu geçelim ben Bilgisayarda bulunan birden fazla olan ip adreslerinden bilgisayarın kullandığı local ip yi nasıl alıcam bunun bir yolu varmı ?

xxxjedixxx sizin üzerinde değişiklik yaptığınız fonksiyon ile doğru sonucu elde edebilirmiyim. Birde şöyle bir durum var benim kullandığım fonksiyon ile kendi bilgisayarımda doğru sonuç almıştım ve işin enteresan tarafı kendi bilgisayarımda da vmware kurulu ve üzerinde en az 4 farklı işletim sistemi kurulu aynı sorunu neden kendi bilgisayarımda yaşamadım. okuldaki bilgisayarlarda kurulu olan işletim sistemi Windows 8 di ondan da kaynaklanıyor olabilir.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen SimaWB »

Vmware kullanmıyorum ama sanal makine kurarken ethernet ile ilgili ayarlarında PC ile aynı IP adresini alması yada DHCP'den otomatik IP almasını sağlayan bir ayar olmalı (En azından VirtualBox'ta bu şekilde)
There's no place like 127.0.0.1
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Domain'e alınmış bilgisayarın ipsini alma

Mesaj gönderen xxxjedixxx »

Verdiğim kod bendeki 3 IP adresini de buluyor. Denemeden bilemezsiniz.
SimaWB yazdı:Küçük bir hatırlatma:
Ip değişkeni (Ip: TStrings;) kod bloğunun sonunda Free edilmeli
SimaWB, yanlışınız var. pIP:TStrings değişkeni fonksiyon içinde create edilmiyor. pIP:TStrings değişkeni Button click içinde create edildiği için orada free edilmelidir. Button1 click hızlıca yapılmış deneme çalıştırması olduğu için uğraşmadım.
En son xxxjedixxx tarafından 10 Haz 2015 10:01 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Cevapla