Вопрос про паскаль: как выполнить команду ping?

 
RU Тихон #27.08.2008 13:53
+
-
edit
 

Тихон

опытный

Необходимо из проги на паскале пинговать адреса в сети.

Как это можно сделать?

Как я понимаю, либо должна быть какая-то команда исполнения ДОС-команды, либо команда запуска внешнего файла.

Подскажите, пожалуйста, как быть? Есть ли способы?

Один рецепт нашёл, но он так плотно завязан на ДОС, что не работает про запуске моей программы в командной строке под ВыньХР. Может есть простой метод?
"Наиболее высоконравственны обычно те, кто дальше всех от решения задач" (с)  
RU Тихон #27.08.2008 14:54
+
-
edit
 

Тихон

опытный

Нашёл вот такой работающий вариант:

uses Dos;

begin
writeLn ('переходим в режим командной строки');
writeLn (' для выхода в программу введите exit');
SwapVectors;
Exec (GetEnv ('COMSPEC'), '');
SwapVectors;
writeLn ('наша программа завершена')
end.


Только вот засада - этот пример выводит просто командную строку...

Мне же надо, чтобы программа ещё ввела туда "ping 127.0.0.1" и потом сама вышла из командной строки.
"Наиболее высоконравственны обычно те, кто дальше всех от решения задач" (с)  
RU Тихон #27.08.2008 15:15
+
-
edit
 

Тихон

опытный

Засада, ещё и в том, что чтобы оно не отожрало всю память и позволило запустить ком. строку, надо в меню паскаля ограничения указывать. Через несколько запусков вылазит стек оверфлоу.
Как с этим бороться?
"Наиболее высоконравственны обычно те, кто дальше всех от решения задач" (с)  
+
-
edit
 

john5r

аксакал
★★
тихон сам с собою я веду беседу...

1 (СЗОФ)
I don't hit women! I would never hit a woman, Chloe! I'd hit a woman who was trying to hit me with a bottle. That's different. That's self-defense, isn't it? Or a woman who could do karate. I'd never hit a woman generally, Chloe. Don't think that. (с) In Bruges  
+
-
edit
 

Vale

Сальсолёт

я бы на твоем месте искал библиотеку для работы с TCP/IP напрямую.
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
RU Тихон #27.08.2008 15:51
+
-
edit
 

Тихон

опытный

Вале, я ж не прграммист! Какие нафик библиотеки и тсп-ип. Мне бы попроще, для тупых.
"Наиболее высоконравственны обычно те, кто дальше всех от решения задач" (с)  
+
-
edit
 

Vale

Сальсолёт

Тихон> Вале, я ж не прграммист! Какие нафик библиотеки и тсп-ип. Мне бы попроще, для тупых.

Если ты программируешь, уже программист.
Если нет - ищи спеца.

Зачем тебе это надо?

инструмент для DDOS атаки пишешь? :F

По сути, в приведенном тобой примере нужно заменить только одну строчку. ;)
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
RU Тихон #27.08.2008 16:05
+
-
edit
 

Тихон

опытный

>Зачем тебе это надо?

Для работы.

>инструмент для DDOS атаки пишешь? :F

Для проверки работоспособности около 150 терминалов.


>По сути, в приведенном тобой примере нужно заменить только одну строчку. ;)

Я даже знаю какую - вот эту: Exec (GetEnv ('COMSPEC'), '');

И надо вроде как менять COMSPEC (это путь к command.com) на что-нибудь вроде "ping.bat".

Только как я её не менял, не получается. Спецов по Паскалю в отделе нет. Отдавать куда-то, чтобы написали спецы - это потонет в болоте организации.
"Наиболее высоконравственны обычно те, кто дальше всех от решения задач" (с)  
Это сообщение редактировалось 27.08.2008 в 16:15
+
-
edit
 

Vale

Сальсолёт

вот код:

Var the_command_line:string;
the_command_line:=' /c ping 127.0.0.1';
Exec (GetEnv ('COMSPEC'), the_command_line);

должно работать.

Правда на паскале я не писал лет 10.
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
Это сообщение редактировалось 27.08.2008 в 16:31
RU Тихон #27.08.2008 16:39
+
-
edit
 

Тихон

опытный

ОГРОМНОЕ СПАСИБО!!!

Работает!

Волшебство прям. Шайтан машина компьютер, однако.
"Наиболее высоконравственны обычно те, кто дальше всех от решения задач" (с)  
US Mishka #27.08.2008 16:48  @Тихон#27.08.2008 16:39
+
-
edit
 

Mishka

модератор
★★☆
Тихон> ОГРОМНОЕ СПАСИБО!!!
Тихон> Работает!
Тихон> Волшебство прям. Шайтан машина компьютер, однако.
code text
  1. Var
  2.   the_command_line : string;
  3.   the_command_params : string;
  4.  
  5. begin
  6.   the_command_line:='c:\\WINDOWS\\system32\\ping.exe';
  7.   the_command_params:='127.0.0.1';
  8.   Exec( the_command_line, the_command_params )
  9. end.

Только объясни мне, как ты будешь проверять результаты пингования? :F
 
RU Тихон #27.08.2008 17:09  @Mishka#27.08.2008 16:48
+
-
edit
 

Тихон

опытный

Тихон>> ОГРОМНОЕ СПАСИБО!!!
Тихон>> Работает!
Тихон>> Волшебство прям. Шайтан машина компьютер, однако.
Mishka> Только объясни мне, как ты будешь проверять результаты пингования? :F

Да с помошью Гомо Сапиенса за компом. Я там состругал стрелочное меню с подменю, чел выбирает нужный пункт и видит результаты пинга.

Хотя с радостью выслушаю предложения по автоматизации процесса!!!
"Наиболее высоконравственны обычно те, кто дальше всех от решения задач" (с)  

Vale

Сальсолёт

Тихон>> ОГРОМНОЕ СПАСИБО!!!
Тихон>> Работает!
Тихон>> Волшебство прям. Шайтан машина компьютер, однако.
Mishka> Только объясни мне, как ты будешь проверять результаты пингования? :F


Проверка опять же на пинг к loopback - даже если сеть не работает, все будет "ок"

А часом пинг не возвращает статус при завершении?

Тихон -

сделай
the_command_line:=' /c ping 127.0.0.1 >pingstat.$$$';

и анализируй результат в файле pingstat.$$$.
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  

Mishka

модератор
★★☆
Vale> Проверка опять же на пинг к loopback - даже если сеть не работает, все будет "ок"

Не всегда — если стек порушен (или не установлен), то и он может не работать.
Vale> А часом пинг не возвращает статус при завершении?

возвращает. Простой bat файл тому подтверждение (назови его xping.bat):
code text
  1. @echo off
  2. ping.exe %1
  3. goto answer%errorlevel%
  4. :answer0
  5. echo got return code 0
  6. goto end
  7.  
  8. :answer1
  9. echo got return code 1
  10. goto end
  11.  
  12. :answer2
  13. echo got return code 2
  14. goto end
  15.  
  16.  
  17. :end


Вот результаты:
code text
  1. E:\t>xping 123.123.123.123
  2.  
  3. Pinging 123.123.123.123 with 32 bytes of data:
  4.  
  5. Request timed out.
  6. Request timed out.
  7. Request timed out.
  8. Request timed out.
  9.  
  10. Ping statistics for 123.123.123.123:
  11.     Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
  12. got return code 1
  13.  
  14. E:\t>xping 127.0.0.1
  15.  
  16. Pinging 127.0.0.1 with 32 bytes of data:
  17.  
  18. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
  19. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
  20. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
  21. Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
  22.  
  23. Ping statistics for 127.0.0.1:
  24.     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
  25. Approximate round trip times in milli-seconds:
  26.     Minimum = 0ms, Maximum = 0ms, Average = 0ms
  27. got return code 0
  28.  
  29. E:\t>


Т.е. 0 — успешно, 1 — с ошибкой.

Vale> Тихон -
Vale> сделай
Vale> the_command_line:=' /c ping 127.0.0.1 >pingstat.$$$';
Vale> и анализируй результат в файле pingstat.$$$.
Помрёт он анализируя этот текст. :)

Тихон, какой Паскаль тебе доступен?
 
+
-
edit
 

Kernel3

аксакал

Mishka> Тихон, какой Паскаль тебе доступен?
У него в Паскале код возврата от cmd.exe, а не пинга, будет.
Broken Windows® cures my ills and makes me feel alright... ©  
+
-
edit
 

Mishka

модератор
★★☆
Работал бы с С/С++, то popen бы использовал и читал бы прямо. :)

А у Борланда, вроде, был пакет расширения по сетевым штучкам. Правда, я не помню, если это было в Дельфи. Ну и у Джавы сетевые расширения мощные.
 
+
-
edit
 

Mishka

модератор
★★☆
Mishka>> Тихон, какой Паскаль тебе доступен?
Kernel3> У него в Паскале код возврата от cmd.exe, а не пинга, будет.
Не в моём примере.
 
+
-
edit
 

Kernel3

аксакал

Mishka> Не в моём примере.
В этом примере Паскаля и нет потому что :F
Broken Windows® cures my ills and makes me feel alright... ©  

Vale

Сальсолёт

Mishka> Помрёт он анализируя этот текст. :)

Ну если так- пусть прямо запускает пинг и анализирует результат :) Как в твоем коде.
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
+
-
edit
 

Kernel3

аксакал

Mishka> А у Борланда, вроде, был пакет расширения по сетевым штучкам. Правда, я не помню, если это было в Дельфи.
В OWL Borland Pascal'я было, ЕМНИС.
Broken Windows® cures my ills and makes me feel alright... ©  
+
-
edit
 

Mishka

модератор
★★☆
Kernel3> В этом примере Паскаля и нет потому что :F
Да ты, брат, заплутал в трёх соснах. :F Посмотри сюда — Вопрос про паскаль: как выполнить команду ping? [Mishka#27.08.08 16:48]
 
+
-
edit
 

Kernel3

аксакал

Mishka> Да ты, брат, заплутал в трёх соснах. :F Посмотри сюда — Вопрос про паскаль: как выполнить команду ping? [Mishka#27.08.08 16:48]
Ну и? Вот здесь где Паскаль?
Broken Windows® cures my ills and makes me feel alright... ©  

au

   
★★
Забыли дос, да? :) Если "ping (..................) > output.txt", то вывод пинга будет в этот самый тхт.
 

Mishka

модератор
★★☆
au> Забыли дос, да? :) Если "ping (..................) > output.txt", то вывод пинга будет в этот самый тхт.
Тогда надо делать
code text
  1. ping 127.0.0.1 > output.txt 2>&1

Чтобы и возможные сообщения об ошибках туда валились.
 
+
-
edit
 

Kernel3

аксакал

Mishka> Чтобы и возможные сообщения об ошибках туда валились.
Они и так будут. Это ж Винда, а не Никс :)
Broken Windows® cures my ills and makes me feel alright... ©  

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru