Сделайте функцию ping с QTcpSocket - PullRequest
0 голосов
/ 29 мая 2020

Я хочу сделать функцию проверки связи с Qt (и мне не нравится способ проверки связи системы выполнения QProcess).

Вот демонстрационный код,

void SimmplePing(const QString& sAddress, int port=80)
{
    QTcpSocket messenger;
    messenger.connectToHost(sAddress, port);
    if (!messenger.waitForConnected(3000))
    {
        qDebug() << messenger.error();
    }
    else
    {
        qDebug() << "OK";
    }
}
void test()
{
    SimmplePing("182.34.19.222", 80);
}

Я тестирую его с помощью «192.168.0.1» (IP-адрес моего маршрутизатора) и «www.baidu.com» могут работать.

Но я тестирую «182.34.19.222» не удалось с сообщением об ошибке QAbstractSocket::SocketTimeoutError.

Однако пинг его в системной cmd может работать правильно. Не мог понять почему. enter image description here

1 Ответ

1 голос
/ 29 мая 2020

Основное отличие здесь в том, что команда ping, как она обычно используется, использует протокол ICMP, который не использует TCP для связи. Попытка подключиться к хосту через веб-сокеты с использованием TCP обрабатывается по-другому. Если TCP-сокет хоста, к которому вы пытаетесь подключиться, не прослушивает указанный порт, в данном случае порт 80, вы не получите ответа, что может привести к поведению, с которым вы столкнулись.
( https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol)

...