Форум программистов, компьютерный форум CyberForum.ru

Ping по списку адресов с применением system - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Dajver_alex
0 / 0 / 1
Регистрация: 21.06.2013
Сообщений: 2
22.07.2013, 15:11     Ping по списку адресов с применением system #1
Здравствуйте.
Возникла необходимость написать консольную программу, которая проверяет Ping-ом список адресов из файла и записывает результат в другой файл. До этого подобное было реализовано в bat-файле. Мудрить с с++ не стал бы, но для моих нужд bat не подходит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <fstream>
 
using namespace std;
string a;
 
//Перегружаем функцию system для удобства использования
 
int system(string cmd) {
    return system(cmd.c_str());
}
 
void ReadFile(string Filename)
{
     ifstream File(a.c_str());
     string Line;
     
     
            while(!File.eof())
            {
                              getline(File, Line);
                              system("ping " + Line);
                              }
}
                              
 
int main()
{
cout << "Input FileName: ";
cin >> a;
ReadFile(a);
system("pause");
return 0;
}
Пример работает, всё хорошо. Но конкретно нужен вывод errorlevel при выполнении команды ping. В bat код выглядел следующим образом -

C++
1
2
ping /n 2 89.20.33.6|Find /I "TTL=">null
if errorlevel=1 ( echo ping 89.20.33.6 - error>>test.txt ) else ( echo ping 89.20.33.6 - succesful>>test.txt )
То есть в выводе ping ищется сочетание "TTL=", если команда ошибку не выдала - пишем в файл усешно, иначе - ошибка.

Хотелось бы реализовать подобную проверку в с++ применительно к примеру выше. Как это возможно?

Добавлено через 2 часа 5 минут
Пробовал в строке 22 добавлять параметры поиска
C++
1
system("ping " + Line + "|Find /I 'TTL='");
Find ругается на неверно заданный параметр.
И суть даже не в параметрах команды в командной строке, а в отсутствии "правильного" вывода от команды system("ping ..."). Потому что ping может выдавать 3 ответа - превышен интервал ожидания, ответ от - ххх: число байт N и третий вариант - ответ от - ууу: заданный узел недоступен. В случае 1 возвращает 1, вроде как ошибка, в случае 2 и 3 - 0, всё в порядке, хотя вариант 3 не отвечает требованиям. как корректно обработать вывод?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2013, 15:11     Ping по списку адресов с применением system
Посмотрите здесь:

ping C++
Вопрос по односвязному списку. C++
Ping...неудается с функцию system поместить переменную C++
Исходники Ping'a C++
Обращаться к списку по индексу C++
C++ Ping Pong 2D, ncurses
Цикл по односвязному списку C++
Что-то наподобие программы ping C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
barbudo59
Я не экстрасенс
 Аватар для barbudo59
375 / 332 / 12
Регистрация: 22.01.2013
Сообщений: 1,125
22.07.2013, 15:32     Ping по списку адресов с применением system #2
Dajver_alex, посмотри готовый вариант
Dajver_alex
0 / 0 / 1
Регистрация: 21.06.2013
Сообщений: 2
22.07.2013, 16:43  [ТС]     Ping по списку адресов с применением system #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
barbudo59, спасибо за вариант, но что-то у меня с ошибками работает. Да и хотелось бы самому создать)
Красивости в виде окон и форм не нужны, достаточно просто консоли. Вся основная проблема сейчас с проклятой функцией system... я уже весь интернет обыскал, начинаю склоняться к использованию icmp.dll... но не верится что-то, что нет простого способа без тонны кода...
может есть какая-то возможность передать из с++ данные в bat-файл? хоть это и извращение, конечно...

Добавлено через 9 минут
По сути алгоритм прост -
1. читаем построчно файл с адресами, записываем строку в переменную.
2. отправляем переменную в функцию system(ping)
3. ловим ответ и делаем с ним что пожелаем(в моем случае пишем в файл rezult.txt)

все пункты кроме ловли ответа работают нормально. Вопрос в том, как заставить функцию возвращать ошибку при ответе от другого узла, потому что ничего похожего на
Bash
1
2
ping /n 2 89.20.33.6|Find /I "TTL=">null
if errorlevel=1 .......
я пока не нашел...

Добавлено через 17 минут
Появилась ещё одна идея - в этом цикле
C++
1
2
3
4
5
 while(!File.eof())
            {
                               getline(File, Line);
                              system("ping " + Line + " >> temp.txt");
                              }
после system вставить поиск в файле temp.txt сочетания "TTL=" и в случае удачи - писать уже в итоговый файл что всё ок.... но это ужасные индусские костыли получаются)

Добавлено через 18 минут
Понемножку движемся вперед. Попробовал ещё раз поэкспериментировать со строкой, передаваемой в system(). Тут есть один момент - команда Find /I "TTL" должна выглядеть именно так, то есть двойные кавычки вокруг TTL. Но в с++ они ограждают параметры, передаваемые в функцию... Пробовал 'TTL' - пишет - "Неправильный формат параметра". Пробовал оградить TTL двойными, а всё остальное одинарными кавычками - ругается компилятор. Помню, что как-то можно передать двойные кавычки в обход компилятора.. но вот деталей что-то не всплывает.

Добавлено через 15 минут
Строить костыли, так строить. Ларчик открылся благодаря добавлению новой переменной Line2, куда из файла была записана строчка |Find /I "TTL=". В итоге на выходе даётся адекватный ответ на ping. Пока что код выглядит вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <fstream>
 
using namespace std;
string a;
string c="res.txt";
 
int system(string cmd) {
    return system(cmd.c_str());
}
 
void ReadFile(string Filename)
{
     string Line2;
     ifstream FiLe(c.c_str());
     getline(FiLe, Line2);
     ifstream File(a.c_str());
     ofstream file("rez.txt");
     string Line;
     
     
            while(!File.eof())
            {                                                
                              getline(File, Line);
                              file << system("ping /n 3 " + Line + Line2) << endl;                              
                              }
                              file.close();
}
                              
 
int main()
{
cout << "Input FileName: ";
cin >> a;
ReadFile(a);
system("pause");
return 0;
}
Yandex
Объявления
22.07.2013, 16:43     Ping по списку адресов с применением system
Ответ Создать тему
Опции темы

Текущее время: 09:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru