Из Бейсика на C++

Есть программа, написанная на Microsoft Quick Basic v.4.50, которая пингует сайт и при не получении ответа от сайта в течении 120 секунд производит перезагрузку.
есть 2 причины моей просьбы:

  1. при запуске данной программы запускается также непонятный процесс под названием «ntvdm.exe», который вешает комп на 98% быстродействия (QB 4.5 не способен компилировать под современные ОС);
    вот снимок экрана:
    Введите описание изображения

  2. EXE-файл нижеприведённой программы не способен запуститься через команду Start и запускать его можно только из BAT-файла простым вызовом типа: «c:\cc.exe» — тут не получиться задать минимальный приоритет работы программы;

ON ERROR GOTO er
ex% = 0
WHILE ex% < 12
      SHELL "ping /n 1 google.com|Find /I " + CHR$(34) + "TTL=" + CHR$(34) + ">qqqq"
      OPEN "qqqq" FOR INPUT AS #1
      IF NOT EOF(1) THEN LINE INPUT #1, a$ ELSE a$ = ""
      CLOSE #1
      l% = LEN(a$)
      IF l% = 0 THEN ex% = ex% + 1 ELSE ex% = 0
      SLEEP 10
      GOTO jump
  er:
      CLOSE #1
  jump:
WEND
SHELL "shutdown -t 0 -r -f"
END

коммент к строке 4:
это Batch-команда (т.е. команда, вызываемая из BAT-файла, которая сохраняет значение пинга в файл qqqq без расширения):

ping /n 1 google.com|Find /I "TTL=">qqqq

а так — вроде как обычный Бейсик.....

огромная просьба:
перепишите мне пожалуйста данный код программы на язык C и скомпилируйте EXE-файл

есть вариант использования Batch-команд:

echo off
SetLocal EnableExtensions
if "%~1"=="" (start "" /normal "%~fs0" ~& exit)
:begin
ping -n 6 127.1 >NUL
ping -n 1 google.com|Find /I "TTL=" && (set n=0 & goto begin) || set /a n+=1
if "%n%"=="12" shutdown -t 0 -r -f
goto begin

но и этот вариант у меня «не прошёл»
— претензий к коду Batch у меня нет
просто в процессе продолжительной работе вылазит сообщение об ошибке, касающееся Ping.exe
— я точно не знаю в чем причина этого сообщения, но одно могу сказать точно:
пока я не нажму «Ок» в данном окне сообщения, — то Batch-программа работать не будет
(т.е. в любом случае нужно убрать окно сообщения об ошибке, — в противном случае код Batch-файла приостанавливает свою работу)

RDLNEO, пожалуйста оформляйте свои сообщения в соответствии с правилами разметки, принятыми на этом сайте.

Moderator

Если переписывать совсем втупую, то примерно так:

#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>

using namespace std;

const int LIMIT = 12;

int main() {

    int counter = 0;
    string str;
    ifstream ifs;
    while (counter < LIMIT) {
        system("ping /n 1 google.com|Find /I \"TTL=\" >qqqq");
        ifs.open("qqqq");
        if (ifs) {
            getline(ifs, str);
            ifs.close();
        }
        else {
            str = "";
        }
        if (str.length() == 0) {
            counter++;
            // cout << "counter = " << counter << endl;
        }
        else {
            counter = 0;
            // cout << "success" << endl;
        }
        if (counter >= LIMIT) {
            system("shutdown -t 0 -r -f");
        }
        Sleep(10000);
    }
    return 0;
}

Но это — говнокод. При вызове ping'а сначала запускается процесс cmd.exe, который вызывает ping.exe и find. Да еще потом веселая передача информации через файл. Говнокод, одним словом.

Если же делать нормально, то почитай IcmpSendEcho function. Тогда можно будет обойтись и без лишних обращений к системе, и без передачи информации через внешний файл.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

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

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.