2013-03-07 4 views

ответ

26

быстрый и грязный способ, чтобы проверить, если узел может решить www.google.com:

require('dns').resolve('www.google.com', function(err) { 
    if (err) { 
    console.log("No connection"); 
    } else { 
    console.log("Connected"); 
    } 
}); 

Это не весь несложный, так как ваш RaspPi может быть подключен к Интернету еще не в состоянии решить www.google.com по какой-то причине , и вы также можете проверить err.type, чтобы различать «неспособность разрешить» и «не удается подключиться к серверу имен, чтобы соединение могло быть недоступным»).

+1

Решение зависит от Google. Есть ли альтернатива и что-то вроде стандартного способа? – Deep

+1

@ Deep, если у вас есть собственный сайт, попробуйте разрешить его вместо Google. В противном случае доступными серверами, такими как google, являются ваш лучший вариант. https://github.com/sindresorhus/is-online является опцией – Ero

+0

Кажется, что это кэширует результат, поэтому, если ваше приложение потеряет соединение после запуска этого кода, это создаст ложное впечатление о наличии соединения. – BrunoLM

7

Некоторое время назад мне приходилось создавать нечто похожее в приложении NodeJS. То, как я это делал, это сначала использовать функцию networkInterfaces() - это OS-модуль, а затем проверить, нет ли у одного или нескольких интерфейсов не-внутреннего IP-адреса.

Если это правда, то я использовал exec(), чтобы запустить ping с хорошо определенным сервером (мне нравятся DNS-серверы Google). Проверяя возвращаемое значение exec(), я знаю, что ping был успешным или нет. Я скорректировал количество пингов на основе типа интерфейса. Викинг процесса вызывает некоторые накладные расходы, но поскольку этот тест не выполняется слишком часто в моем приложении, я могу себе это позволить. Кроме того, используя ping и IP-адреса, вы не будете зависеть от настроенного DNS. Вот пример:

var exec = require('child_process').exec, child; 
child = exec('ping -c 1 128.39.36.96', function(error, stdout, stderr){ 
    if(error !== null) 
      console.log("Not available") 
     else 
      console.log("Available") 
}); 
33

Хотя решение robertklep работает, это далеко не лучший выбор для этого. Требуется около 3 минут для dns.resolve до таймаута и дать сообщение об ошибке, если у вас нет подключения к Интернету, а dns.lookup почти мгновенно отвечает с ошибкой ENOTFOUND.

Так что я сделал эту функцию:

function checkInternet(cb) { 
    require('dns').lookup('google.com',function(err) { 
     if (err && err.code == "ENOTFOUND") { 
      cb(false); 
     } else { 
      cb(true); 
     } 
    }) 
} 

// example usage: 
checkInternet(function(isConnected) { 
    if (isConnected) { 
     // connected to the internet 
    } else { 
     // not connected to the internet 
    } 
}); 

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

+1

Решение зависит от Google. Есть ли альтернатива и что-то вроде стандартного способа? – Deep

+3

Deep Kakkar вам нужно изучить, как работает интернет.Кто-то уже сказал вам это, но здесь он повторился (дословно): такого «стандартного» способа нет, потому что для тестирования ** подключения к Интернету вам нужно что-то проверить на ** интернет **. Если вам не нравится тестирование против Google, проверьте на Facebook, Yahoo, Wall Street Journal или на любом другом сайте. Но вы должны использовать сайт на ** фактическом интернет **. Другого пути нет. –

4

Это не так несложный, насколько это возможно, но получить работу:

var dns = require('dns'); 
dns.lookupService('8.8.8.8', 53, function(err, hostname, service){ 
    console.log(hostname, service); 
    // google-public-dns-a.google.com domain 
}); 

просто использовать простой if(err) и обрабатывать ответ адекватно. :)

ps .: Пожалуйста, не беспокойтесь, рассказывая мне, что 8.8.8.8 - это не имя, которое нужно разрешить, это просто поиск высокодоступного DNS-сервера из Google. Целью является проверка возможности подключения, а не разрешение имен.

+0

Решение зависит от Google. Есть ли альтернатива и что-то вроде стандартного способа? – Deep

+3

Нет такого «стандартного» способа, потому что для того, чтобы проверить наличие ** интернет-соединения, вы должны проверить что-то на самом деле ** в Интернете **. Я полагаю, вы можете проверить все, что хотите, amazon, isp, cdn, IDK, просто использовали Google для простоты, BTW с использованием IP делает его независимым от DNS. –

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