更新时间:2023-02-20 21:21:54
如果在 Windows 上,您需要以编程方式检查是否主机可以访问,我建议使用 _popen()
而不是 system()
。
If on Windows you need to check programmatically if an host is reachable, I suggest using _popen()
instead of system()
.
实际上,使用 管道 ,您可以使用 system()$ c $执行命令c>,但除此之外,其输出还会重定向到流。之后,您可以完全访问流,就像处理文件一样,读取输出并解析所需的内容。
In fact with pipes you can execute a command like with system()
, but in addition its output is redirected to a stream. After that you can access the stream exactly how you'd do with a file, reading the output and parsing whatever you need.
在此链接,您可以找到 _popen()。您将能够轻松找到所有相关功能(例如 _pclose()
)。
At this link you can find Microsoft official documentation for _popen()
. You will be easily able to find all related functions (such as _pclose()
).
在以下示例程序中, ping 命令(仅向Google DNS服务器请求两次回显以节省时间)。然后,以文本读取模式打开的获取的 FILE *
用于通过 normal 循环的 fread访问流。 ()
调用:
In the following demonstrative program a ping
command is sent (asking for only two echoes to Google DNS server in order to save time). Then the obtained FILE *
, opened in textual read mode, is used to access the stream with a normal loop of fread()
calls:
#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 =
的存在来完成此操作。 >子字符串,如果可以成功ping操作,我肯定会以每种语言显示(根据PC设置,输出可能以不同的语言打印)。 fgets()
,这一次可以很好地读取和解析一行,并且还需要较小的读取缓冲区。
TTL=
substring, that I'm sure will be present in every language in case of successful ping (the output may be printed in different languages according to PC settings).fgets()
, that would be great to read and parse one line at a time, and would also require a smaller reading buffer.尽管问题是关于Windows的,但我不得不说基于 popen()
, pclose()
等,在Linux上将非常相似。
Though the question is about Windows, I have to say that the implementation on Linux would be very similar, based on popen()
, pclose()
and so on.
您可以在手册页。