Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 5390|回复: 2

求一个跨平台的通过域名取得主机IP地址的函数

[复制链接]

该用户从未签到

发表于 2011-5-12 15:02:10 | 显示全部楼层 |阅读模式
求一个跨平台的通过域名取得主机IP地址的函数,要求能通过域名取得IP地址,如,通过“www。baidu。com”,取得百度的主机IP地址是“119。75。218。45”。要跨平台,也就是这样一个函数能在Win32、Linux、WinCE、MacOS、IPhone中同时使用。下面这个是在delphi中测试可行的函数,但在lazarus却无法编译通过。

//根据主机域名取得主机的IP地址,使用本函数时请在uses子句中添加上WinSock
//调用方法:
//var IpAddress: String;
//IpAddress := HostNameToIpAddress('www。baidu。com');
function HostNameToIpAddress(AHostName: String): String;
var
  WSAData: TWSAData;
  HostEnt: PHostEnt;
begin
  result:='';
  WSAStartup(2, WSAData);
  HostEnt := gethostbyname(PChar(AHostName));
  if HostEnt <> nil then
  begin
    with HostEnt^ do
     result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);
    end;
    WSACleanup;
end;
回复

使用道具 举报

该用户从未签到

发表于 2011-5-13 15:10:53 | 显示全部楼层
uses
  Windows, Winsock, Classes, SysUtils, ...

即可编译, 但只能在windows下运行.

Synapse有相应函数.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2013-6-8 16:28:34 | 显示全部楼层
//此段代码在win7 和 ubuntu 11.04均可正常编译
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  {$IFDEF linux}
  netdb, Sockets
  {$ELSE}
  Windows, Winsock
  {$ENDIF}
  ;
type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

{$IFDEF linux}

procedure TForm1.Button1Click(Sender: TObject);
var
  he: THostEntry;
  i: Integer;
  s: string;
begin
  if not ResolveHostByName(Edit1.Text, he) then Exit;

  s:= IntToStr(he.Addr.s_bytes[1]) + '.'
      + IntToStr(he.Addr.s_bytes[2]) + '.'
      + IntToStr(he.Addr.s_bytes[3]) + '.'
      + IntToStr(he.Addr.s_bytes[4]);

  Edit2.Text:= s;
end;

{$ELSE}
function HostNameToIpAddress(AHostName: String): String;
var
  WSAData: TWSAData;
  HostEnt: PHostEnt;
begin
  result:='';
  WSAStartup(2, WSAData);
  HostEnt := gethostbyname(PChar(AHostName));
  if HostEnt <> nil then
  begin
    with HostEnt^ do
     result:= Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);
    end;
    WSACleanup;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text:= HostNameToIpAddress(Edit1.Text);
end;
{$ENDIF}

end.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 09:43 , Processed in 0.029384 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表