若有一代理主服务器A  IP地址为10.1.1.20,另一从代理服务器B  IP地址为10.34.23.45 通过代理服务器A上网,而代理服务器B下另有168.192.34.XXX类客户端C。现用Indy Misc 中IPWatch控件从客户端只能取得192.168.34.XXX,怎样才能取得服务器A 的IP地址10.1.1.20 或将其上级代理器IP全部取得。  望不吝赐教。

解决方案 »

  1.   

    var 
       LEN:DWORD;
       NAME:PCHAR;
       HOST:PHOSTENT;
       IP,ipstr,IPTOTAL,IPPART,IPALL:STRING;
       i:integer;
       wsdata:twsadata;
    begin
       if wsastartup(2,wsdata)<>0 then
       begin
                  msg.Caption :='WS2_32.DLL初始化失敗!';
                  abort;
       end;
                LEN:=30;
                GETMEM(NAME,30);
                GETCOMPUTERNAME(NAME,LEN);
                HOST:=GETHOSTBYNAME(NAME);
                IF HOST=NIL THEN
                BEGIN
                    MSG.Caption :='IP地址為空';
                    HALT;
                END
                ELSE
                BEGIN
                  IPTOTAL :=HOST.H_NAME;
                  IPPART:=CHR(HOST.H_ADDRTYPE+64);
                FOR I:=1 TO 4 DO
                BEGIN
                  IP:=INTTOSTR(ORD(HOST.H_ADDr^[i-1]));
                  ipstr:=ipstr+ip;
                  if i<4 then
                    ipstr:=ipstr+'.'
                  Else IPALL :=ipstr;
                END;
               END;
                wsacleanup;
    end;
    ipall中就是你的ip 地址
      

  2.   

    楼上的代码在我机器上运行到 wsastartup(2,wsdata)处产生错误,无法进行调试。我的方法为直接引用 uses IdWinsock。是否要加其它控件或其它引用。
      

  3.   

    function LocalIP : string;
    type
      TaPInAddr = array[0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
      phe: PHostEnt;
      pptr: PaPInAddr;
      Buffer: array[0..63] of char;
      I: Integer;
      GInitData: TWSADATA;
    begin
         Result := '';
         WSAStartup($101, GInitData);
         try
            GetHostName(Buffer, SizeOf(Buffer));
            phe := GetHostByName(buffer);
            if phe <> nil then
            begin
                 pptr := PaPInAddr(Phe^.h_addr_list);
                 I := 0;
                 while pptr^[I] <> nil do
                 begin
                      result := StrPas(inet_ntoa(pptr^[I]^));
                      Inc(I);
                 end;
            end;
         finally
            WSACleanup;
         end;
    end;
    -------------------------
    然后在form的OnShow 事件写入
    edit1.text:=LocalIP;
    ======================即可看到你的IP
      

  4.   

    to  jackie168(星星知我心) 没那么多代码吧?uses WinSock;function GetLocalIP: string;
    var
      wVersionRequested: WORD;
      wsaData: TWSAData;
      p: PHostEnt;
      s: array[0..128] of Char;
    begin
      wVersionRequested := MAKEWORD(1, 1);
      WSAStartup(wVersionRequested, wsaData);
      try
        GetHostName(@s, 128);
        p := GetHostByName(@s);
         Result := StrPas(iNet_ntoa(PInAddr(p^.h_addr_list^)^));
      finally
        WSACleanup
      end
    end;
      

  5.   

    楼上两位取的均是本地地址,即上文所指客户端 C 的地址,而我希望取得 A,B 的地址。