Получить локальный IP-адрес в Qt

Существует ли кроссплатформенный способ получения локального IP-адреса (то есть что-то похожее на 192.168.1.49) компьютера, использующего Qt?

Я хочу создать FTP-сервер для телефона Symbian и показать IP-адрес, к которому должен подключиться FTP-клиент.

25

Решение

использование QNetworkInterface :: allAddresses ()

foreach (const QHostAddress &address, QNetworkInterface::allAddresses()) {
if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress(QHostAddress::LocalHost))
qDebug() << address.toString();
}
39

Другие решения

QNetworkInterface::allAddresses() даст вам сетевые адреса. Затем вы можете отфильтровать результаты по адресам IPv4, которые не являются адресами обратной связи:

QList<QHostAddress> list = QNetworkInterface::allAddresses();

for(int nIter=0; nIter<list.count(); nIter++)

{
if(!list[nIter].isLoopback())
if (list[nIter].protocol() == QAbstractSocket::IPv4Protocol )
qDebug() << list[nIter].toString();

}
13

Если вам требуется больше информации, чем просто IP-адреса (например, подсеть), вы должны выполнить итерацию по всем интерфейсам.

QList<QNetworkInterface> allInterfaces = QNetworkInterface::allInterfaces();
QNetworkInterface eth;

foreach(eth, allInterfaces) {
QList<QNetworkAddressEntry> allEntries = eth.addressEntries();
QNetworkAddressEntry entry;
foreach (entry, allEntries) {
qDebug() << entry.ip().toString() << "/" << entry.netmask().toString();
}
}
5

QNetworkInterface возвращает много адресов. Вы должны отфильтровать их, чтобы получить желаемый результат:

foreach (const QNetworkInterface &netInterface, QNetworkInterface::allInterfaces()) {
QNetworkInterface::InterfaceFlags flags = netInterface.flags();
if( (bool)(flags & QNetworkInterface::IsRunning) && !(bool)(flags & QNetworkInterface::IsLoopBack)){
foreach (const QNetworkAddressEntry &address, netInterface.addressEntries()) {
if(address.ip().protocol() == QAbstractSocket::IPv4Protocol)
qDebug() << address.ip().toString();
}
}
}
2

Я хотел получить eth1 IP-адрес моей целевой машины. Ответы, приведенные выше, помогли мне получить то, что я хотел: вот как я написал свою функцию, чтобы получить мне IP-адрес имени сетевого интерфейса eth1,

QNetworkInterface eth1Ip = QNetworkInterface::interfaceFromName("eth1");
QList<QNetworkAddressEntry> entries = eth1Ip.addressEntries();
if (!entries.isEmpty()) {
QNetworkAddressEntry entry = entries.first();
qDebug() << entry.ip();
}
1

Вот код, который я реализовал, чтобы получить: имя, IP, маску сети и MAC-адрес localhost.

   QString localhostname =  QHostInfo::localHostName();
QString localhostIP;
QList<QHostAddress> hostList = QHostInfo::fromName(localhostname).addresses();
foreach (const QHostAddress& address, hostList) {
if (address.protocol() == QAbstractSocket::IPv4Protocol && address.isLoopback() == false) {
localhostIP = address.toString();
}
}
QString localMacAddress;
QString localNetmask;
foreach (const QNetworkInterface& networkInterface, QNetworkInterface::allInterfaces()) {
foreach (const QNetworkAddressEntry& entry, networkInterface.addressEntries()) {
if (entry.ip().toString() == localhostIP) {
localMacAddress = networkInterface.hardwareAddress();
localNetmask = entry.netmask().toString();
break;
}
}
}
qDebug() << "Localhost name: " << localhostname;
qDebug() << "IP = " << localhostIP;
qDebug() << "MAC = " << localMacAddress;
qDebug() << "Netmask = " << localNetmask;
1
По вопросам рекламы [email protected]