한델 QandA에서 이런 소스를 찾았습니다.
IP주소를 입력하면 컴퓨터의 이름을 알아내는 프로그램을 짤려고 하는데요...
아래의 소스를 실행하면 Phe값이 nil이 되고 아무것도 알아낼 수가 없어요.
물론 uses winsock했구요 문법적인 오류는 나지 않는데...
추가적인 코드가 필요한가요?
@윈도 프로그래밍 정말 눈물나게 어렵네요..TT
@고수님들 도움을 바라며... 행복하세요...
procedure TForm1.Button1Click(Sender: TObject);
var
Address: DWord; // 이진의 IP주소(4 bytes)
Phe: PHostEnt; // HostEntry 구조체
HostName, HostIP: String;
begin
Edit2.Text := '';
Label3.Caption := '';
if Edit1.Text = '' then
begin
ShowMessage('컴퓨터 이름을 입력하세요.');
System.Exit;
end;
// 인터넷의 IP주소를 의미하는 문자열은 네 개의 숫자와 그들을 구분하는 도트(".')
// 로 구성된다. 그래서 inet_addr은 그 문자열에 해당하는 네트워크 바이트 순서로
// 된 이진의 IP주소를 리턴한다(4 bytes).
Address := inet_addr(PChar(Edit1.Text));
// inet_addr은 인자로 전달된 도트 표현의 IP주소에서 4개의 숫자 가운데
// 255를 넘는 값이 있다거나 기타 이유로 이진 IP주소로 변환될 수 없는
// 문제가 있는 문자열인 경우 INADDR_NONE 값을 리턴한다.
if (Address = INADDR_NONE) then
begin
// GetHostByName 함수는 인자에 해당하는 호스트의 이름을 가진 호스트에 대한
// hostent구조에 대한 포인터를 리턴한다.
// GetHostByName 함수는 보통 네트워크 데이터베이스의 hosts파일을 참조하거나,
// 도메인 네임 서버(domain name server)에다 주소에 해당하는 호스트를 찾는
// 메시지를 보내고 그에 대한 응답을 기다린다.
Phe := GetHostByName(PChar(Edit1.Text));
if Phe <> Nil then
begin
Address := Longint(plongint(Phe^.h_addr_list^)^); {이진의 IP주소(4 bytes)}
HostName := Trim(Phe^.h_name); {호스트명}
HostIP := StrPas(inet_ntoa(TInAddr(Address))); {도트 표현의 IP주소}
end;
end
else
begin
// GetHostByAddr 함수는 인자로 주어진 호스트의 주소와 형태를 가진 호스트를 찾아
// hostent구조에 대한 포인터를 리턴한다("4, PF_INET"는 변함 없음)
Phe := GetHostByAddr(@Address, 4, PF_INET);
if Phe = Nil then
begin
HostName := StrPas(inet_ntoa(TInAddr(Address))); {도트 표현의 IP주소}
HostIP := StrPas(inet_ntoa(TInAddr(Address))); {도트 표현의 IP주소}
end
else
begin
HostName := Trim(Phe^.h_name); {호스트명}
HostIP := StrPas(inet_ntoa(TInAddr(Address))); {도트 표현의 IP주소}
end;
end;
if Address = INADDR_NONE then
begin
ShowMessage('컴퓨터 IP를 알 수 없습니다.');
System.Exit;
end;
Edit2.Text := HostIP;
Label3.Caption := HostName;
end;