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.
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;
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
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
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ı.
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;
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.
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.
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.
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;
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.
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)
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.