Если на 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()
и т. Д.
Вы описание упомянутых функций можно найти в справочной странице .