2015-05-25 77 views
1

在Ada中,如何以獨立於操作系統的方式最佳地遍歷適配器(查找分配的IP和子網)?是否有像我可以使用的Gnat Sockets套件? 下面是我們目前使用的代碼 - 但是這是直接使用Windows API。我怎樣才能最好地實現相同的事情,而不是Windows特定的?Ada Os獨立適配器迭代

function Get_Adapters_Info (The_Adapter_Info  : Ip_Adapter_Info_Access; 
          Output_Buffer_Length : Win32.PULONG) return Win32.DWORD; 
pragma Import (Stdcall, Get_Adapters_Info, "GetAdaptersInfo"); 


procedure Iterate_Ip_Addresses (Handler : not null access procedure (The_Information : Ip_Address_Info)) is 
    Return_Code : Win32.DWORD; 
    The_Size : aliased Win32.ULONG := 0; 
    use type Win32.DWORD; 
    use type Win32.UINT; 
begin 
    Return_Code := Get_Adapters_Info (null, The_Size'unchecked_access); --' 
    if The_Size > 0 then 
     declare 
     function Convert is new Ada.Unchecked_Conversion (System.Address, Ip_Adapter_Info_Access); 
     The_Buffer : Unsigned.Byte_String (1..Natural(The_Size)); 
     The_Info : Ip_Adapter_Info_Access := Convert (The_Buffer(The_Buffer'first)'address); 
     begin 
      Return_Code := Get_Adapters_Info (The_Info, The_Size'unchecked_access); --' 
      if Return_Code = Win32.Winerror.NO_ERROR then 
       loop 
        if (The_Info.Kind = Mib_If_Type_Ethernet) or (The_Info.Kind = Mib_If_Type_Ieee80211) then 
         declare 
          Ip_Address_List : Ip_Addr_String_Access := The_Info.Ip_Address_List'unchecked_access; --' 
         begin 
          loop 
           declare 
            The_Address : constant Ip_Address := Convert(Ip_Address_List.Ip_Address); 
            use type Ip_Address; 

           begin 
            if The_Address /= Any_Address then -- Active 
             Handler.all (The_Information => (The_Address => The_Address, 
                Subnet_Mask  => Convert(Ip_Address_List.Ip_Mask))); 
            end if; 
           end; 
           Ip_Address_List := Ip_Address_List.Next; 
           exit when Ip_Address_List = null; 
          end loop; 
         end; 
        end if; 
        The_Info := The_Info.Next; 
        exit when The_Info = null; 
       end loop; 
      end if; 
     end; 
    end if; 
end Iterate_Ip_Addresses; 
+0

除非現有的Ada庫爲您處理,否則沒有便攜式或獨立於操作系統的方式。 –

+0

我會先看看Gnat.Sockets包。 http://en.wikibooks.org/wiki/Ada_Programming/Libraries/GNAT.Sockets我不認爲它提供瞭如此低層次的網絡硬件接口,但它必須在內部使用某種類型的接口。或者,如果您可以使用其他語言(可能是C)找到這樣的庫,則可以輕鬆地爲其生成綁定。 –

+0

注意:我只是查找'GetAdaptersInfo'來查看它是什麼,我發現的微軟頁面說在XP和更高版本上使用'GetAdaptersAddresses'。 XP已經死了,所以'GetAdaptersInfo'必須是過時的。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365917%28v=vs.85%29.aspx – ajb

回答

2

ADA的標準不包括網絡編程,因此短期,不令人滿意的答案是沒有

由於這些操作依賴操作系統,我能提供的最好建議是隱藏操作系統的依賴:

  • 將您的Get_Adapters_Info規範成Iterate_IP_Addresses身體。
  • 使Iterate_IP_Addresses的主體分開。
  • 爲您想要支持的每個操作系統提供一個實現(主體)Iterate_IP_Addresses
  • 在編譯時選擇合適的Iterate_IP_Addresses作爲構建過程的一部分。