如何让TIdStackLocalAddress在Android平台正常工作?
本地IP获取:Indy10在Android平台的问题与解决思路
问题现象
基于Indy10编写的getLocalIP函数在Windows 10平台运行正常,能正确返回多个本地IP地址,示例输出如下:
No of Addresses: 4 IPv4 Addresses: IP Address #0: 192.168.56.1 - 255.255.255.0 - 11 IP Address #1: 192.168.1.7 - 255.255.255.0 - 8 IP: 192.168.56.1
但切换到Android 64位平台(已连接局域网WiFi的三星S21)时,仅能返回本地回环IP,无其他有效结果,示例输出如下:
No of Addresses: 1 IPv4 Addresses: IP Address #0: 127.0.0.1 - - 0 IP: 127.0.0.1
问题原因
最初怀疑是权限缺失导致,但实际问题出在Indy10的GStack.GetLocalAddressList方法在Android平台存在缺陷,需采用Dave Nottage的修复方案来解决。
子网掩码获取补充
若需要获取Indy方法本该返回的子网掩码,可使用我提供的解决方案。
实现代码
function getLocalIP: string; begin Result := ''; try var IPList := TIdStackLocalAddressList.Create; try TIdStack.IncUsage; try GStack.GetLocalAddressList(IPList); finally TIdStack.DecUsage; end; WriteLog('DEBUG', 'No of Addresses: ' + IntToStr(IPList.Count)); WriteLog('DEBUG', 'IPv4 Addresses:'); var IPStrings := TStringList.Create; try for var i in IPList do begin if TIdStackLocalAddressIPv4(i).IPVersion = Id_IPv4 then begin IPStrings.Add(TIdStackLocalAddressIPv4(i).IPAddress + ' - ' + TIdStackLocalAddressIPv4(i).SubNetMask + ' - ' + TIdStackLocalAddressIPv4(i).InterfaceIndex.ToString); end; end; // show IP Addresses in the log file for var i := 0 to IPStrings.Count-1 do WriteLog('DEBUG', 'IP Address #' + IntToStr(i) + ': ' + IPStrings[i]); Result := IPStrings[0].Split([' - '])[0]; WriteLog('DEBUG', 'IP: ' + Result); finally IPStrings.Free; end; finally IPList.Free; end; except On E: Exception do begin Result := ''; WriteLog('ERROR', 'IP Error: ' + E.message); end; end; end;
内容的提问来源于stack exchange,提问作者Terry Peterson
相关产品推荐
相关产品推荐

