2010-04-08 5 views
2

я пытаюсь получить состояние компьютера в моей локальной сети ... мысль об использовании QTcpSocket, но это не действительно эффективным, так как порт также должен быть включен в качестве:Как проверить состояние компьютера с помощью Qt?

socket->connectToHost("hostName", portNumber); 
if (socket->waitForConnected(1000)) 
    qDebug("Connected!"); 

может кто-нибудь demonstare мне лучший способ проверить если компьютер отвечает?

+2

Вы пытаетесь определить связность локальной машине или что на удаленной машине? –

ответ

1

ping

int exitCode = QProcess::execute("ping", QStringList() << "-c1" << "hostname"); 
if (0 == exitCode) { 
    // it's alive 
} else { 
    // it's dead 
} 

Аргументы могут различаться. Например, я считаю, что это будет ping -n 1 "hostname" на Windows. Пример должен работать на большинстве версий, отличных от Windows.

+3

Некоторые брандмауэры блокируют это, и он принимает внешний системный вызов. Это, конечно, не идеальное. –

+1

-1: Я полностью согласен с Калебом Педерсоном. –

+0

Извините, больше не можете повышать. Он выглядит как единственный надежный способ сделать это в Qt :-) –

-1

Одним из хороших способов является подтверждение того, что они могут разрешать имена доменов, используя QHostInfo. Если они могут, то они, вероятно, имеют доступ в Интернет:

QHostInfo::lookupHost("www.kde.org", this, SLOT(lookedUp(QHostInfo))); 

Конечно, вы могли бы просто попытаться подключиться к хосту, а также, что еще лучше доказательство того, что все работает правильно. Я бы сделал это асинхронно, а не синхронно, но это действительно лучший тест.

+0

Другой компьютер может умереть и по-прежнему иметь активную запись DNS. –

+0

Да, и тогда не имеет значения, можете ли вы выполнить ping или разрешить имя хоста. В этом случае, как я уже сказал, лучший способ - это по-настоящему попытаться подключиться к нему. –

1

Вы пытаетесь проверить, расположен ли ваш локальный компьютер в сети или какой-либо целевой компьютер?

Существует не очень хороший кросс-платформенный способ сделать это. Ближайший на qt QNetworkInterface, и проверить атрибут «ISup» - это не идеально, он может быть активным, если у вас есть сетевой кабель, подключенный, но только к маршрутизатору, и неактивен, если у вас есть 3G-модем, но он не находится на вызов.

В Windows проверки InternetGetConnectedState()

Смежные вопросы