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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Dajver_alex
0 / 0 / 1
Регистрация: 21.06.2013
Сообщений: 2
#1

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

22.07.2013, 15:11. Просмотров 1586. Ответов 2
Метки нет (Все метки)

Здравствуйте.
Возникла необходимость написать консольную программу, которая проверяет 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 (C++):

Ping...неудается с функцию system поместить переменную - C++
неудается с функцию system поместить переменную...при запуске выводит что неудалось найти узел string...как запихать переменные в system? ...

Ping по кнопке адресов из БД - Delphi
Есть бд ip адресов в аксесе нужно по кнопке пинговать нужный адрес

.NET 4.x Ping-запросы массива адресов - C#
Всем привет, ребятки! Дело такое. Есть массив адресов (IP), которые нужно поочередно проверить на ping (пингуется или нет). Перерыл...

Как сохранить файлы по списку url адресов? - Python
Здравствуйте. Нужно просканировать html страницу и сохранить все файлы по ссылкам на этой странице. Как это сделать в python3?

Ping ІР-адресов,записанных в текстовом файле и вывод инфы по каждому ІР (рабочий\нерабочий) - C#
Нужно написать программу, которая с текстового файла будет считывать іp- адреса и пинговать их, на вывод программа должна подать файл с...

Как с System.Net.NetworkInformation.Ping пинговать сервера? - C#
Всем привет! Сделав программу для проверки моего сервера (Сайта), я сделал вроде как неплохую программу (Дос))0) ). Сайты им хорошо...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
barbudo59
Я не экстрасенс
377 / 334 / 12
Регистрация: 22.01.2013
Сообщений: 1,125
22.07.2013, 15:32 #2
Dajver_alex, посмотри готовый вариант
Dajver_alex
0 / 0 / 1
Регистрация: 21.06.2013
Сообщений: 2
22.07.2013, 16:43  [ТС] #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 16:43
Привет! Вот еще темы с ответами:

Есть ping по IP, нет ping по имени - Windows Server
Здравствуйте. Имею AD, DNS, DHCP, терминальная ферма, тонкие клиенты (всё введено в домен) Контроллер домена - ad.mydomen.local...

.NET 4.x Важно!При нажатии на кнопке выдает: using System; using System.Collections.Generic; using System - C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Что за классы System, System.Drawing, System.Windows.Forms - PascalABC.NET
Народ, объясните пожалуйста что за классы: System, System.Drawing, System.Windows.Forms. В справке как-то ничего не нашел. Если там есть,...

Подключение и работа с System, System.IO, System.Collections.Generic; - C++/CLI
Здравствуйте, не подскажите почему не работают using namespace System, using namespace System.Collections.Generic и др. Что нужно сделать...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru