Network programming Ada Os独立适配器迭代

Network programming Ada Os独立适配器迭代,network-programming,operating-system,ada,ethernet,Network Programming,Operating System,Ada,Ethernet,在Ada中,如何最好地以独立于操作系统的方式迭代适配器(以查找分配的IP和子网)?有没有像Gnat插座这样的软件包我可以使用? 下面是我们目前使用的代码——不过这是直接使用Windows API的代码。我如何才能在不特定于Windows的情况下最好地实现同样的目标 函数获取适配器信息(适配器信息:Ip适配器信息访问; 输出缓冲区长度:Win32.PULONG)返回Win32.DWORD; pragma导入(Stdcall,Get_Adapters_Info,“GetAdaptersInfo”);

在Ada中,如何最好地以独立于操作系统的方式迭代适配器(以查找分配的IP和子网)?有没有像Gnat插座这样的软件包我可以使用? 下面是我们目前使用的代码——不过这是直接使用Windows API的代码。我如何才能在不特定于Windows的情况下最好地实现同样的目标

函数获取适配器信息(适配器信息:Ip适配器信息访问;
输出缓冲区长度:Win32.PULONG)返回Win32.DWORD;
pragma导入(Stdcall,Get_Adapters_Info,“GetAdaptersInfo”);
过程迭代Ip地址(处理程序:非空访问过程(信息:Ip地址信息))为
返回_代码:Win32.DWORD;
_Size:别名为Win32.ULONG:=0;
使用Win32.DWORD类型;
使用Win32.UINT类型;
开始
Return_Code:=Get_Adapters_Info(null,大小为'unchecked_access');--'
如果大小>0,则
声明
函数转换是新的Ada.Unchecked\u转换(System.Address,Ip\u适配器\u信息\u访问);
_缓冲区:Unsigned.Byte_字符串(1..Natural(_大小));
_-Info:Ip_-Adapter_-Info_-Access:=转换(_-Buffer(_-Buffer'first')地址);
开始
Return_Code:=Get_Adapters_Info(_Info,The_Size'unchecked_access);--
如果Return\u Code=Win32.Winerror.NO\u错误,则
环
如果(Info.Kind=Mib\u if\u Type\u以太网)或(Info.Kind=Mib\u if\u Type\u Ieee80211),则
声明
Ip地址列表:Ip地址字符串访问:=未选中的Ip地址列表-'
开始
环
声明
地址:常量Ip地址:=转换(Ip地址列表.Ip地址);
使用类型Ip_地址;
开始
如果\u地址/=任何\u地址,则--Active
Handler.all(_信息=>(_地址=>_地址,
子网掩码=>转换(Ip地址列表.Ip掩码));
如果结束;
结束;
Ip地址列表:=Ip地址列表。下一步;
当Ip_地址_列表=null时退出;
端环;
结束;
如果结束;
_Info:=_Info.Next;
当_Info=null时退出;
端环;
如果结束;
结束;
如果结束;
结束迭代Ip地址;

Ada标准不包括网络编程,因此简短而不令人满意的答案是

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

  • 将您的
    Get\u Adapters\u Info
    规范移动到
    Iterate\u IP\u Addresses
    的主体中
  • 迭代IP地址的主体分开
  • 为要支持的每个操作系统提供
    迭代IP\U地址的实现(正文)
  • 选择编译时迭代IP地址的适当实现作为构建过程的一部分

除非现有的Ada库可以为您处理,否则没有可移植或独立于操作系统的方法来实现这一点。我将从Gnat.Sockets包开始。我不认为它为网络硬件提供了如此低级的接口,但它必须在内部使用类似的东西。另外,如果你能在另一种语言(可能是C语言)中找到这样一个库,你可以很容易地为它生成绑定。旁注:我只是查了一下
getAdapterInfo
,看看它是什么,我发现的Microsoft页面说在XP和更高版本上使用了
getAdapterAddresses
。XP已经死了,所以
getAdapterInfo
肯定已经过时了。