Ada Os独立适配器迭代

时间:2015-05-25 08:15:52

标签: network-programming operating-system ada ethernet

在Ada中,如何以独立于操作系统的方式最好地迭代适配器(以查找分配的IP和子网)?我可以使用像Gnat Sockets这样的包吗? 下面是我们当前使用的代码 - 但是这是直接使用Windows API。如果不是Windows特定的,我怎样才能最好地实现同样的目标呢?

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;

1 个答案:

答案 0 :(得分:2)

Ada标准不包括网络编程,所以简短但不满意的答案是

由于这些操作 依赖于操作系统,我可以提供的最佳建议是隐藏操作系统依赖性:

  • 将您的Get_Adapters_Info规范移至Iterate_IP_Addresses。{/ li>的正文中
  • Iterate_IP_Addresses的正文分开。
  • 为您要支持的每个操作系统提供Iterate_IP_Addresses的实现(正文)。
  • 在编译时选择Iterate_IP_Addresses的适当实现作为构建过程的一部分。