电脑上安装有多个网卡,请问如何获取它们的ip地址和对应的MAC地址,谢谢!

解决方案 »

  1.   

    Delphi 获得多网卡适配器的MAC地址
    http://hi.baidu.com/%CD%F8%B3%E6%D0%EC/blog/item/73b8340fe2a4fccd7bcbe19f.html
    参考
      

  2.   

    获取所有本机IP地址
    function GetLocalIpList(var IpList:TStringList):Integer;
    type
      TaPInAddr = array[0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
      HostName:   array [0..MAX_PATH] of char;
      NameLen:    Integer;
      WSData:     TWSAData;
      lpHostEnt:  PHostEnt;
      I:          Integer;
      pptr:       PaPInAddr;
    begin
      Result := 0;
      if WSAStartup(MakeWord(2,0), WSData) <> 0 then Exit;
      try
        NameLen := sizeof(HostName);
        fillchar(HostName, NameLen, 0);
        NameLen := GetHostName(HostName, NameLen);
        if NameLen = SOCKET_ERROR then Exit;
        lpHostEnt := GetHostByName(HostName);
        if lpHostEnt = Nil then Exit;
        I := 0;
        pPtr := PaPInAddr(lpHostEnt^.h_addr_list);
        IpList.Clear;
        while pPtr^[I] <> nil  do
          begin
            IpList.ADD( inet_ntoa(pptr^[I]^));
            Inc(I);
          end;
        Result := IpList.Count;
      finally
        WSACleanup;
      end;
    end;
      

  3.   

    可以针对注册表操作 比较简单!~~具体位置网上查吧!~还有一个方法,调用ShellAPI来启动cmd将返回的数据存储在字符串数组里,一一解析!~后者麻烦!不如前者效率高
      

  4.   

    function GetMacAddress(const AServerName : string) : string; 
    type 
         TNetTransportEnum = function(pszServer : PWideChar; 
                                      Level : DWORD; 
                                      var pbBuffer : pointer; 
                                      PrefMaxLen : LongInt; 
                                      var EntriesRead : DWORD; 
                                      var TotalEntries : DWORD; 
                                      var ResumeHandle : DWORD) : DWORD; stdcall;      TNetApiBufferFree = function(Buffer : pointer) : DWORD; stdcall;      PTransportInfo = ^TTransportInfo; 
         TTransportInfo = record 
                           quality_of_service : DWORD; 
                           number_of_vcs : DWORD; 
                           transport_name : PWChar; 
                           transport_address : PWChar; 
                           wan_ish : boolean; 
                         end; var E,ResumeHandle, 
        EntriesRead, 
        TotalEntries : DWORD; 
        FLibHandle : THandle; 
        sMachineName, 
        sMacAddr, 
        Retvar : string; 
        pBuffer : pointer; 
        pInfo : PTransportInfo; 
        FNetTransportEnum : TNetTransportEnum; 
        FNetApiBufferFree : TNetApiBufferFree; 
        pszServer : array[0..128] of WideChar; 
        i,ii,iIdx : integer; 
    begin 
      sMachineName := trim(AServerName); 
      Retvar := '00-00-00-00-00-00';  // Add leading \\ if missing 
      if (sMachineName <> '') and (length(sMachineName) >= 2) then begin
        if copy(sMachineName,1,2) <> '\\' then
          sMachineName := '\\' + sMachineName
      end;   // Setup and load from DLL 
      pBuffer := nil; 
      ResumeHandle := 0; 
      FLibHandle := LoadLibrary('NETAPI32.DLL');  // Execute the external function 
      if FLibHandle <> 0 then begin 
        @FNetTransportEnum := GetProcAddress(FLibHandle,'NetWkstaTransportEnum');
        @FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree');
        E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0, 
                               pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);     if E = 0 then begin 
          pInfo := pBuffer;       // Enumerate all protocols - look for TCPIP 
          for i := 1 to EntriesRead do begin 
            if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin 
              // Got It - now format result xx-xx-xx-xx-xx-xx 
              iIdx := 1; 
              sMacAddr := pInfo^.transport_address;           for ii := 1 to 12 do begin 
                Retvar[iIdx] := sMacAddr[ii]; 
                inc(iIdx); 
                if iIdx in [3,6,9,12,15] then inc(iIdx); 
              end; 
            end;         inc(pInfo); 
          end; 
          if pBuffer <> nil then FNetApiBufferFree(pBuffer); 
        end;     try 
          FreeLibrary(FLibHandle); 
        except 
          // 错误处理
        end;
      end;
      result:=Retvar;
    end;
      

  5.   

    獲取mac地址   IP_ADAPTER_INFO = record
        Next: PIP_ADAPTER_INFO;
        ComboIndex: DWORD;
        AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;
        Deforbiddenion: array[1..MAX_ADAPTER_DEforbiddenION_LENGTH + 4] of char;
        AddressLength: UINT;
        Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
        Index: DWORD;
        aType: UINT;
        DHCPEnabled: UINT;
        CurrentIPAddress: PIP_ADDR_STRING;
        IPAddressList: IP_ADDR_STRING;
        GatewayList: IP_ADDR_STRING;
        DHCPServer: IP_ADDR_STRING;
        HaveWINS: BOOL;
        PrimaryWINSServer: IP_ADDR_STRING;
        SecondaryWINSServer: IP_ADDR_STRING;
        LeaseObtained: LongInt;
        LeaseExpires: LongInt;
       end;const
        AddrLen = 6;
    var
        PAdapterInfo: PIP_ADAPTER_INFO;
        ret: DWORD;
        i: integer;
        Next: PIP_ADAPTER_INFO;
        sMAC: string;
        OutBufLen: ULONG;
    begin
        GetAdaptersInfo(nil, @OutBufLen); // to get the required size 
        // alloc memory size = OutBufLen
        PAdapterInfo := AllocMem(OutBufLen);
        ret:= GetAdaptersInfo(PAdapterInfo, @OutBufLen);
        if ret = 0 then
        begin
        Next:= PAdapterInfo;
        repeat
            Memo1.Lines.Add('Deforbiddenion: '+ Next^.Deforbiddenion);
            sMAC := 'MAC address: ';
            for i := 0 to AddrLen do
            begin
            sMAC := sMAC + IntToHex(Next^.Address[i], 2);
            if i <> AddrLen then
            sMAC := sMAC + '-';
            end;
            Memo1.Lines.Add(sMAC);
            Next:= Next^.Next;
        until Next = nil;
        end;    FreeMem(PAdapterInfo, OutBufLen);end;
      

  6.   

    能否把ip和Mac地址的对应关系写出来,楼上的几位朋友要么是只获得ip,要么只获得mac地址,现在问题是获得的ip如何和获得的mac地址对应起来
    其实我有更简单的获取ip地址方法:
    uses IdStack;
    var
      allip:string;
    allip :=GStack.LocalAddresses.text;而且获取mac的方法跟bdmh网友的方法相同,
    就是不知道如何把它们对应起来
      

  7.   

    function GetMacAddress(var IPList: TStrings) : string;
    type 
         TNetTransportEnum = function(pszServer : PWideChar; 
                                      Level : DWORD; 
                                      var pbBuffer : pointer; 
                                      PrefMaxLen : LongInt; 
                                      var EntriesRead : DWORD; 
                                      var TotalEntries : DWORD; 
                                      var ResumeHandle : DWORD) : DWORD; stdcall;      TNetApiBufferFree = function(Buffer : pointer) : DWORD; stdcall;      PTransportInfo = ^TTransportInfo;
         TTransportInfo = record
                           quality_of_service : DWORD; 
                           number_of_vcs : DWORD; 
                           transport_name : PWChar; 
                           transport_address : PWChar;
                           wan_ish : boolean; 
                         end; 
    type
      TaPInAddr = array[0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
      HostName:   array [0..MAX_PATH] of char;
      NameLen:    Integer;
      WSData:     TWSAData;
      lpHostEnt:  PHostEnt;
      pptr:       PaPInAddr;
    var E,ResumeHandle, 
        EntriesRead,
        TotalEntries : DWORD; 
        FLibHandle : THandle; 
        sMachineName, 
        sMacAddr, 
        Retvar : string; 
        pBuffer : pointer; 
        pInfo : PTransportInfo;
        FNetTransportEnum : TNetTransportEnum; 
        FNetApiBufferFree : TNetApiBufferFree; 
        pszServer : array[0..128] of WideChar; 
        i,ii,iIdx : integer; 
    begin 
      sMachineName := '\\127.0.0.1';
      Retvar := '00-00-00-00-00-00';
      // Setup and load from DLL 
      pBuffer := nil; 
      ResumeHandle := 0; 
      FLibHandle := LoadLibrary('NETAPI32.DLL');  // Execute the external function 
      if FLibHandle <> 0 then begin 
        @FNetTransportEnum := GetProcAddress(FLibHandle,'NetWkstaTransportEnum');
        @FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree');
        E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0,
                               pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);     if E = 0 then begin 
          pInfo := pBuffer; 
          if WSAStartup(MakeWord(2,0), WSData) <> 0 then Exit;
          try
            NameLen := sizeof(HostName);
            fillchar(HostName, NameLen, 0);
            NameLen := GetHostName(HostName, NameLen);
            if NameLen = SOCKET_ERROR then Exit;
            lpHostEnt := GetHostByName(HostName);
            if lpHostEnt = Nil then Exit;
            I := 0;
            pPtr := PaPInAddr(lpHostEnt^.h_addr_list);
            IpList.Clear;
            while pPtr^[I] <> nil  do
              begin          // Enumerate all protocols - look for TCPIP
                inc(pInfo); 
                if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin
                  // Got It - now format result xx-xx-xx-xx-xx-xx
                  iIdx := 1;
                  sMacAddr := pInfo^.transport_address;              for ii := 1 to 12 do begin
                    Retvar[iIdx] := sMacAddr[ii];
                    inc(iIdx);
                    if iIdx in [3,6,9,12,15] then inc(iIdx); 
                  end;
                end;
                IpList.ADD( inet_ntoa(pptr^[I]^)+'='+Retvar);
                Inc(I);
              end;
            
          finally
            WSACleanup;
          end;
          if pBuffer <> nil then FNetApiBufferFree(pBuffer); 
        end;     try 
          FreeLibrary(FLibHandle); 
        except 
          // 错误处理
        end;
      end;
      result:=Retvar;
    end;
      

  8.   

    可否用汇编直接将MacID直接读出来?
      

  9.   

    你看我給的代碼中的 record結構!有CurrentIPAddressconst
        AddrLen = 6;
    var
        PAdapterInfo: PIP_ADAPTER_INFO;
        ret: DWORD;
        i: integer;
        Next: PIP_ADAPTER_INFO;
        sMAC,sIp: string;
        OutBufLen: ULONG;
    begin
        GetAdaptersInfo(nil, @OutBufLen); // to get the required size 
        // alloc memory size = OutBufLen
        PAdapterInfo := AllocMem(OutBufLen);
        ret:= GetAdaptersInfo(PAdapterInfo, @OutBufLen);
        if ret = 0 then
        begin
        Next:= PAdapterInfo;
        repeat
            Memo1.Lines.Add('Deforbiddenion: '+ Next^.Deforbiddenion);
            sMAC := 'MAC address: ';
            for i := 0 to AddrLen do
            begin
              sMAC := sMAC + IntToHex(Next^.Address[i], 2);
              if i <> AddrLen then
                sMAC := sMAC + '-';
            end;
            sIp:= Next^.CurrentIPAddress;//取得當前網卡的ip地址
            Memo1.Lines.Add(sMAC+':'+sIP);
            Next:= Next^.Next;
        until Next = nil;
        end;    FreeMem(PAdapterInfo, OutBufLen);end;
      

  10.   

    此record在delphi中,如下表示/------IP address structures---------------------------------------------------
        PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
        IP_ADDRESS_STRING = array[0..15] of char; // IP as string    PIP_ADDR_STRING = ^IP_ADDR_STRING;
        IP_ADDR_STRING = record
        Next: PIP_ADDR_STRING;
        IpAddress: IP_ADDRESS_STRING;
        IpMask: IP_ADDRESS_STRING;
        Context: DWORD;
        end;
    //------ADAPTER INFO STRUCTURES-------------------------------------------------
        PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
         IP_ADAPTER_INFO = record
         Next: PIP_ADAPTER_INFO;
         ComboIndex: DWORD;
         AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;
         Deforbiddenion: array[1..MAX_ADAPTER_DEforbiddenION_LENGTH + 4] of char;
         AddressLength: UINT;
         Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
         Index: DWORD;
         aType: UINT;
         DHCPEnabled: UINT;
         CurrentIPAddress: PIP_ADDR_STRING;
         IPAddressList: IP_ADDR_STRING;
         GatewayList: IP_ADDR_STRING;
         DHCPServer: IP_ADDR_STRING;
         HaveWINS: BOOL;
         PrimaryWINSServer: IP_ADDR_STRING;
         SecondaryWINSServer: IP_ADDR_STRING;
         LeaseObtained: LongInt;
         LeaseExpires: LongInt;
        end;  sIp:= Next^.CurrentIPAddress^.IpAddress;此API的來源
     function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
        pOutBufLen: PULONG): DWORD; stdcall;
        external 'Iphlpapi.dll' name 'GetAdaptersInfo';