Как проверить состояние подключения порта Ethernet в Qt?

Я новичок в Qt. На самом деле, я хочу проверить, подключен ли Ethernet или нет через приложение qt. Например: когда данные передаются от источника к месту назначения через Ethernet. если я внезапно отключу кабель Ethernet, мое приложение Qt должно выдать какое-то всплывающее сообщение, например «соединение недоступно». Есть ли способ найти этот? Наконец, извините за мой английский.


person vidhyadharan    schedule 14.12.2018    source источник
comment
Если предположить, что вы не используете необработанные кадры Ethernet для передачи данных, а используете TCP/IP, то проверка состояния сетевых интерфейсов, вероятно, не является правильным путем. У пользователя также может быть соединение VPN, PPP или WLAN, пользователь может переключаться между сетями, конечный компьютер может быть отключен от сети... Вы, скорее всего, создадите раздражение для пользователя. Просто доверяйте работе ОС и сети Qt и сообщайте об ошибках, которые вы получаете от Qt для конкретного соединения.   -  person hyde    schedule 14.12.2018


Ответы (2)


Возможно, вы захотите рассмотреть API Qt «Bearer Management»:

http://doc.qt.io/qt-5/bearer-management.html

Например:

/ Set Internet Access Point
QNetworkConfigurationManager manager;
const bool canStartIAP = (manager.capabilities()
                          & QNetworkConfigurationManager::CanStartAndStopInterfaces);
// Is there default access point, use it
QNetworkConfiguration cfg = manager.defaultConfiguration();
if (!cfg.isValid() || (!canStartIAP && cfg.state() != QNetworkConfiguration::Active)) {
    QMessageBox::information(this, tr("Network"), tr(
                                 "No Access Point found."));
    return;
}
person paulsm4    schedule 14.12.2018

Если вы работаете в Linux, я нашел где-то хорошую идею, чтобы проверить с помощью QT и QProcess, физически ли подключен Ethernet-кабель.

QProcess process;
QString sNetCableStatus = "";
process.start("sh", QStringList()<<"-c"<<"grep \"\" /sys/class/net/eth0/carrier");
process.waitForFinished();
sNetCableStatus = process.readAllStandardOutput();
if (sNetCableStatus.length() != 0)
{
    if (sNetCableStatus.left(1) == "1")
    {
        //connected
    }
    else if(sNetCableStatus.left(1) == "0")
    {
        //disconnected
    }
    else
    {
        //that should not happen
    }
}
person TommySmoke    schedule 10.04.2021