功能:获得本机的所有ip地址(内网、外网)
代码如下:
procedure GetIPAddr(List: TStrings);
type
    TaPInAddr = array [0..100] of PInAddr;
    PaPInAddr = ^TaPInAddr;
var
    phe  : PHostEnt;
    pptr : PaPInAddr;
    Buffer : array [0..63] of char; 
    I    : Integer;
    GInitData      : TWSADATA;
begin
    List.Clear;
    WSAStartup($101, GInitData);
    GetHostName(Buffer, SizeOf(Buffer));
    phe :=GetHostByName(buffer);
    if phe = nil then Exit; 
    pptr := PaPInAddr(Phe^.h_addr_list);
    I := 0;
    while pptr^[I] <> nil do begin
      List.Add(StrPas(inet_ntoa(pptr^[I]^)));
      Inc(I);
    end; 
    WSACleanup;
end

解决方案 »

  1.   

    现在的问题:
      在两台机器上的运行结果不一样
      1.pc-1 只能显示出内网ip,公网ip显示不出来.
      2.pc-2 内网、外网ip都可以显示出来。
      

  2.   

    我想造成这样的原因和adsl modem 设置有关,
      pc-1:adsl modem 设置成“路由”方式
      pc-2:adsl modem 有的是“EnterNet 500”拨号连接。(ppp)
    初学网络编程,请各位高手指教。
      

  3.   

    supersheng
      why ?
      已经测试,结果可以
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
            Ip:string;
            Ipstr:string;
            Buffer:Array[1..32] of char;
            i:integer;
            WSData:TWSAdata;
            Host:PHostEnt;
    begin
            if WSAstartup(2,WSData)<>0 then
            begin
                ShowMessage('WS2_32.DLL初始化失败!');
                halt;
            end;
            try
                if GetHostName(@Buffer[1],32)<>0 then
                begin
                    ShowMessage('没有得到主机名!');
                    halt;
                end;
            except
                ShowMessage('没有成功返回主机名');
                halt;
            end;
            Host := GetHostByName(@Buffer[1]);
            if Host = nil then
                 begin
                    ShowMessage('IP地址为空');
                    halt;
                 end
            else
                 begin
                    Edit2.Text := Host.h_name;
                    Edit3.Text := Chr(Host.h_addrtype+64);
                    for i:=1 to 4 do
                        begin
                            Ip:=IntToStr(Ord(Host.h_addr^[i-1]));
                            ShowMessage('分段IP地址为:'+Ip);
                            if i<4 then
                               Ipstr := Ipstr + Ip + '.'
                            else
                               Edit1.Text:=Ipstr+Ip;
                            end;
                        end;
                    WSACleanup;
                 end;
    end.