Как выполнить пинг-тест программно на Windows? - PullRequest
1 голос
/ 02 апреля 2020

Я хотел бы сделать IP-тест в программе командной строки C на Windows.

Теперь я использую команду cmd в своей программе с чем-то вроде этого:

if(system("ping -c1 8.8.8.8  -w 2 ") == 0){
    printf("request successful\n");
    return true; 
}else{
    printf("request not successful\n");
    return false;
}

Обратите внимание, что приведенный выше код является лишь примером: с моей программой я попытаюсь пропинговать некоторые устройства, чтобы проверить, подключены ли они к сети; если нет, я знаю, что есть проблема с подключением. Так как мне нужен только статус подключения, нет необходимости показывать результаты.

Есть ли другой способ сделать то же самое программно , то есть без cmd-окна? Как скрытый запрос в фоновом режиме.

1 Ответ

0 голосов
/ 03 апреля 2020

Если на Windows вам необходимо программно проверить доступность хоста, я предлагаю использовать _popen() вместо system().

In Фактически с pipe вы можете выполнить команду, как с system(), но, кроме того, ее вывод перенаправляется в поток. После этого вы можете получить доступ к потоку точно так же, как и к файлу, читая вывод и анализируя все, что вам нужно.

На по этой ссылке вы можете найти официальную документацию Microsoft для _popen(). Вы легко сможете найти все связанные функции (например, _pclose()).

В следующей демонстрационной программе отправляется команда ping (запрашивая только два эхо-сигнала на DNS-сервере Google, чтобы сэкономить время) , Затем полученный FILE *, открытый в текстовом режиме чтения, используется для доступа к потоку с помощью нормальных l oop из fread() вызовов:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define BUFFER_SIZE 1024

char buffer[BUFFER_SIZE] = { 0 };

int main( void )
{
    FILE * pipe = _popen( "ping 8.8.8.8 -n 2", "rt" );
    if( pipe != NULL )
    {
        int rd = 0, ret;

        while( ( ret = fread( buffer+rd, 1, BUFFER_SIZE - rd, pipe ) ) > 0 )
        {
            rd += ret;
        }

        if( strstr( buffer, "TTL=" ) != NULL )
        {
            printf( "\nThe host is reachable!\n" );
        }
        else
        {
            printf( "\nThe host is NOT reachable!\n" );
        }

        //printf( "%d bytes read\n\n%s\n", rd, buffer );

        _pclose( pipe );
    }
    else
    {
        printf( "Error in pipe opening!\n" );  
    }
    return 0;
}

Некоторое дальнейшее объяснение

  • В этом примере проверяется только простой хост достижимость . Хост считается достижимым, если хотя бы эхо возвращается.
  • Я сделал это, проверив наличие подстроки TTL=, которая, я уверен, будет присутствовать на каждом языке в случае успешного пинга (вывод может быть напечатан на разных языках в соответствии с настройками P C).
  • Настройте размер буфера в соответствии с ожидаемой длиной, необходимой для поиска нужной подстроки. В моем примере 1024 байта было достаточно далеко для ожидаемой длины ответа.
  • Вы можете найти, прокомментировал, печать всего буфера. Вы можете использовать эту строку для проверки всего , что вам нужно (например, среднее время пинга).
  • Чтобы читать из потока, не стесняйтесь использовать вашу любимую функцию. Другой популярной альтернативой может быть fgets(), которая будет полезна для чтения и анализа по одной строке за раз, а также потребует меньшего буфера чтения.

Аналогично Linux

Хотя вопрос касается Windows, я должен сказать, что реализация на Linux будет очень похожа, на основе popen(), pclose() и т. Д.

Вы описание упомянутых функций можно найти в справочной странице .

...