问题描述
我有一个 qt/qml 应用程序,我部署在带有 BSP 的 imx6 上,我必须检索 eth0
接口的 ipv4 地址。为了部署应用程序,我设置了一个静态 ip,我可以使用下面的代码正确检索它:
QNetworkInterface eth0Ip = QNetworkInterface::interfaceFromName("eth0");
QList<QNetworkAddressEntry>entries = eth0Ip.addressEntries();
if(!entries.isEmpty() && entries.first().ip().isLoopback() == false)
{
ipAddress = entries.first().ip().toString();
}
但是当我将电路板连接到 QList
中的路由器时,我只有一个带有 ipv6 地址的条目,但没有 ipv4。在路由器页面中,我可以看到电路板分配了 ipv4,我可以正确使用它通过 ssh 进行连接。显示的 ipv6 不可翻译为 v4。
我尝试了其他带有系统调用的解决方案来检索地址,但结果始终相同:
解决方案 1:
int fd;
struct ifreq ifr;
fd = socket(AF_INET,SOCK_DGRAM,0);
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name,"eth0",IFNAMSIZ-1);
ioctl(fd,SIocgIFADDR,&ifr);
close(fd);
ipAddress = QString(inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
解决方案 2:
struct ifaddrs *ifaddr,*ifa;
int s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1)
{
ipAddress = "getifaddrs error";
return;
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
continue;
s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host,NI_MAXHOST,NULL,NI_NUMERICHOST);
if((strcmp(ifa->ifa_name,"eth0")==0)&&(ifa->ifa_addr->sa_family==AF_INET))
{
ipAddress = QString(host);
}
}
当我通过 ssh 连接并使用 ifconfig
时,我可以看到分配的正确 ipv4 和 ipv6,但在应用程序上看不到。
有什么想法吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)