Всем привет! Я только начинаю работать в сабже, до этого все больше VB.NET, php… Вот, собственно, такой вопрос – как в сабже выполнить консольную команду в фоновом режиме и считать первую вернувшуюся строку? Если более конкретно – надо получить адрес первого узла при трассировке любого ip. То есть выполнить команду, к примеру, tracert ya.ru и, как только получена первая строка с ip-адресом ближайшего узла, прекратить выполнение команды, а полученные данные сохранить в буфере для последующей работы. Да, буду крайне признателен, если скажете, где можно почитать маны по работе с консолью из сабжа.
25 июня 2009 в 13:04
Роман Me llamo Román Чваников
>Петр Рогов, далеко не всегда, к сожалению, таблица маршрутизации даст >верный результат, именно тот, который мне нужен. Да и искать то все >равно пришлось бы – что route print, что tracert…
Вы не правы. Таблица маршрутизации всегда даст точный ответ на какой адрес через какой шлюз будут отправляться пакеты. А "route print" я не предлагал использовать, я предлагал программно получить всю таблицу маршрутизации через соответствующий API.
25 июня 2009 в 2:00
>>>Считать выводной поток программы? По-моему, ANSI C, опять-таки, этого не позволяет
>fprintf(stdout, …);
Не очень понятно, что имелось в виду под fprintf(stdout, ..), как родительский процесс узнает, что вывел потомок? В юниксах это реализуется системными вызовами pipe и dup2. Некоторое время назад специально искал, как в windows реализовать эту функциональность- все, что нашел это вот эта статья-пример с RSDN://rsdn.ru/article/files/progs/inetd.xml
24 июня 2009 в 18:04
Не за что. Слежу за темой, отпишись, получилось или нет.
24 июня 2009 в 17:05
Всем спасибо за комментарии.
Денис GooDWiN Гублин, если бы инструмент не был бы важен – я бы делал все через vb.net где хоть что то понимаю… Ну или c#.NET – не столь уж сильно они отличаются.
Петр Рогов, далеко не всегда, к сожалению, таблица маршрутизации даст верный результат, именно тот, который мне нужен. Да и искать то все равно пришлось бы – что route print, что tracert…
Переносимость – не главная моя задача, можно использовать WinApi
Денис "Марсианин" Лисов
>>извлекать адрес просто как последнее поле в нужной строке.
кстати, возможно Вы и правы, несмотря на неизящность такого решения, действительно нужный мне IP-адрес находится в конце 5й строки в квадратных скобках…
>>Считать выводной поток программы? По-моему, ANSI C, опять-таки, этого не позволяет
fprintf(stdout, …);
А библиотеку для работы с регулярками не посоветуете?
Евгений Raison_d'être Тюкавкин
Писать библиотеку для сравнения с регэксп-шаблоном? Нуу… Я всего лишь новичек тут, пока что это, думаю, не для меня…
Кирилл Быков
Спасибо, гляну… Когда последний раз отвечал – сильно хотел спать, так и не спросил у гугла, "шо цэ такэ pipe" =)
24 июня 2009 в 15:01
простите-извините, я понимаю, что комментарий мой не ценен и "дурной тон", но попробуйте обратить внимание на WSH с его JScript и VBScript, если инструмент не важен. Специально предназначены для решения подбного рода задач, может, там вдруг окажется проще? Еще раз простите.
24 июня 2009 в 13:05
Еще вопрос применительно к задаче (я понимаю, что суть вопроса автора в другом, но все-таки…). Первый узел при трассировке – это обычно шлюз по-умолчанию. Не проще ли его извлечь откуда-то еще? В конце-концов посмотреть таблицу маршрутов? По этому поводу можно посмотреть вот тут: //msdn.microsoft.com/en-us/library/aa374013(VS.85).aspx а также рядом там весь это API, пишут что он доступен начиная с Windows 2000.
24 июня 2009 в 13:04
я уточню – WinAPI использовать можно или должна быть переносимость?
Если можно, то, по-моему, можно через CreateProcess и смежные функции добиться подобного функционала, надо почитать MSDN. Помню точно что где-то видел реализацию подобного на C, но не могу вспомнить точно
24 июня 2009 в 13:00
Роман Me llamo Román Чваников, стандартная библиотека ANSI C регулярные выражения не включает. Хотите работать с ними – берите отдельные библиотеки. По мне так проще использовать опцию -d и извлекать адрес просто как последнее поле в нужной строке.
Считать выводной поток программы? По-моему, ANSI C, опять-таки, этого не позволяет. Перенаправить во временный файл и считать его?
24 июня 2009 в 12:05
Может будет проще разобраться с принципом работы tracert и написать свою реализацию? Или встроить в свою программу уже готовый код.
C/C++ сами по себе со строками практически не умееют работать. Проверку регэкспу нужно писать самому либо брать готовую библиотеку.
Если требуется получить данные из вывода другой программы, то с помощью popen или подобной функции запускается нужная команда, а с ее выводом работа идет как с файлом.
24 июня 2009 в 12:01
В ансицэ ничего не подскажу. В стандартах не силён. Загугли pipe и fifo, возможно, в винде есть поддержка таких вещей, а если повезёт, то и хорошая поддержка, с возможностью перенаправлять туда консольный вывод. В таком случае, можно и первую строчку выловить. А если нет, то перенаправлять в файл и следить, когда там эта строчка появится.
24 июня 2009 в 8:04
Перенаправление в файл не нужно – мне в приложении надо с этими данными работать. А второе – может поясните? Я сталкивался с термином pipe, однако в несколько иных контекстах – при работе с соединениями, базами данных вроде…
24 июня 2009 в 8:04
Да, кстати, был крайне удивлен, когда ничего толком не нашел в гугле по использованию регулярок в сабже. Нашел кучу примеров на C++, однако я с ним никогда раньше не работал, поэтому не уверен, что смогу транслировать в анси си (хотя честно даже попытался разобраться…)
Быть может, подскажете, каким образом можно проверить char[] на соответствие регэкспу?
24 июня 2009 в 7:04
Возможно, можно как-нибудь перенаправить вывод, например, в какой-нибудь файл или pipe.
24 июня 2009 в 3:02
Так… Научился запускать трассировку из приложения – system("tracert ya.ru");
но вот теперь задача повеселее для новичка – запуск должен быть незаметным, а потом еще и ip выбрать из кучи символов… Надеюсь, это можно будет решить с помощью регулярок А пока остро стоит вопрос о запуске в фоновом режиме…