2010-12-27 4 views
2

Я написал программу на C, которая общается через udp с Arduino. Мой вопрос в том, как я могу «ping» ip-адрес и получить только 1 или 0 (доступно или нет) в C (unix).Проверьте, не подключено устройство/доступно

Звонок system("ping xxx.xxx.xxx.xxx"); не работает, потому что он выводит список ...?

ответ

2
system("ping -c 1 127.0.0.1 > /dev/null"); 

Если сделать трюк. -c 1 отправляет только один пакет. Мы подключаемся к /dev/null, так как мы не заботимся о выходе на stdout (это список, на который вы ссылаетесь?). Если вы также хотите сбросить stderr, добавьте 2>&1 в конец. Вы также можете ограничить время отклика, используя -W.

Вызов возвращает целое число, представляющее успех или сбой. 0 указывает на успех, в то время как ненулевое целое число представляет ошибку. Вот пример кода: http://ideone.com/cf0eR

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

+0

Я попробовал, но на самом деле ничего не выводит, если устройство подключено или нет ... – JNK

+0

@JNK Функция 'system()' возвращает целое число, как я объяснил. Я целенаправленно отбрасывал все остальные выходные данные по трубопроводам на '/ dev/null'. – marcog

+0

Моя ошибка ... работает! : D – JNK

2

В общем случае вы не можете определить, подключен ли сетевой узел - члену сети IP разрешено не отправлять какие-либо пакеты. Лучший способ - просто начать общение и использовать протокол, который требует, чтобы связанная машина ответила каким-либо образом.

Однако, если вы уверены, что машина отвечает на ping, но не ваши UDP-пакеты, используйте ping -c 1 192.0.32.10. Это решение является очень хрупким, хотя:

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