C语言调用Ping命令
怎样用C语言调用Ping命令,并获得Ping后返回的字符串。
[解决办法]
从定向,管道,open “stdout”
[解决办法]
用管道技术或重定向吧。
具体可以参考我写的
1.《进程通信之二 管道技术第一篇 输入输出的重定向》
http://blog.csdn.net/morewindows/article/details/7390350
2.《进程通信之二 管道技术第二篇 匿名管道》
http://blog.csdn.net/morewindows/article/details/7390441
3.《进程通信之二 管道技术第三篇 命名管道》
http://blog.csdn.net/morewindows/article/details/8260087
-------------------
MoreWindows
计科小硕 迅雷/微软/豌豆荚实习生 CSDN博客专家 CSDN2012年度博客之星
我的微博:http://weibo.com/MoreWindows
我的博客:http://blog.csdn.net/MoreWindows
[解决办法]
有时CSDN缺了赵老师这根胡萝卜还真上不了席!
#include <windows.h>
#include <stdio.h>
char cmdstr[256];
int i;
int YN(int k) {
FILE *f;
char fn[40];
char ln[80];
int yn=0;
sprintf(fn,"d:\\ping%d.txt",k);
f=fopen(fn,"r");
if (NULL!=f) {
fgets(ln,80,f);
fgets(ln,80,f);
fgets(ln,80,f);
if (1==fscanf(f,"Re%c",&yn)) yn='q'-yn;
fclose(f);
unlink(fn);
}
return yn;
}
void main() {
for (i=115;i<130;i++) {
sprintf(cmdstr,"cmd /c ping 192.168.2.%d -n 1 -w 1000 >d:\\ping%d.txt",i,i);
WinExec(cmdstr,SW_HIDE);
}
Sleep(3000);
for (i=115;i<130;i++) {
printf("%d 192.168.2.%d\n",YN(i),i);
}
}
//1 192.168.2.115
//0 192.168.2.116
//0 192.168.2.117
//0 192.168.2.118
//1 192.168.2.119
//0 192.168.2.120
//0 192.168.2.121
//0 192.168.2.122
//1 192.168.2.123
//0 192.168.2.124
//0 192.168.2.125
//1 192.168.2.126
//0 192.168.2.127
//1 192.168.2.128
//0 192.168.2.129
[解决办法]
PING的windows 版本
#ifndef __PING_H__
#define __PING_H__
#ifdef __cplusplus
extern "C"{
#endif
BOOL Ping(unsigned long ip);
#ifdef __cplusplus
}
#endif
#endif
#include <windows.h>
#include <stdio.h>
#include "ping.h"
#define TIMEOUT 1000 // ping timeout
#define BUFSIZE 64 // ping packet size
typedef struct tagIP_OPTION_INFORMATION{
unsigned char Ttl; // Time To Live
unsigned char Tos; // Type Of Service
unsigned char Flags; // IP header flags
unsigned char OptionsSize; // Size in bytes of options data
unsigned char *OptionsData; // Pointer to options data
} IP_OPTION_INFORMATION, * PIP_OPTION_INFORMATION;
typedef struct tagIP_ECHO_REPLY{
DWORD Address; // Replying address
unsigned long Status; // Reply status
unsigned long RoundTripTime; // RTT in milliseconds
unsigned short DataSize; // Echo data size
unsigned short Reserved; // Reserved for system use
void *Data; // Pointer to the echo data
IP_OPTION_INFORMATION Options; // Reply options
} IP_ECHO_REPLY, *PIP_ECHO_REPLY;
typedef HANDLE (WINAPI* pfnHV)(VOID);
typedef BOOL (WINAPI* pfnBH)(HANDLE);
typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD,
PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD);
pfnHV lpfnIcmpCreateFile;
pfnBH lpfnIcmpCloseHandle;
pfnDHDPWPipPDD lpfnIcmpSendEcho;
/**
ip: returned by inet_addr
return TRUE if remote host is reachable, otherwise return FALSE;
*/
BOOL Ping(unsigned long ip)
{
HANDLE hICMP;
HANDLE hICMP_DLL;
DWORD dwRet;
char acPingBuffer[BUFSIZE];
PIP_ECHO_REPLY pIpe;
hICMP_DLL =LoadLibrary("ICMP.DLL");
if (hICMP_DLL == NULL)
{
printf("LoadLibrary() failed, unable to locate ICMP.DLL! code: %ld\r\n", GetLastError());
return FALSE;
}
/*
Get ICMP functions
*/
lpfnIcmpCreateFile = (pfnHV)GetProcAddress(hICMP_DLL,"IcmpCreateFile");
lpfnIcmpCloseHandle = (pfnBH)GetProcAddress(hICMP_DLL,"IcmpCloseHandle");
lpfnIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hICMP_DLL,"IcmpSendEcho");
if ((!lpfnIcmpCreateFile)
[解决办法]
(!lpfnIcmpCloseHandle)
[解决办法]
(!lpfnIcmpSendEcho)) {
printf ("GetProcAddr() failed for at least one function.\n");
FreeLibrary(hICMP_DLL);
return FALSE;
}
hICMP = (HANDLE)lpfnIcmpCreateFile();
if (hICMP == INVALID_HANDLE_VALUE)
{
printf("IcmpCreateFile() failed. code: %ld\r\n", GetLastError());
FreeLibrary(hICMP_DLL);
return FALSE;
}
memset(acPingBuffer, 0xAA, sizeof(acPingBuffer));
pIpe = (PIP_ECHO_REPLY)GlobalAlloc(
GMEM_FIXED
[解决办法]
GMEM_ZEROINIT,
sizeof(IP_ECHO_REPLY)+sizeof(acPingBuffer));
if (pIpe == NULL)
{
printf("Failed to allocate global ping packet buffer.\r\n");
lpfnIcmpCloseHandle(hICMP);
FreeLibrary(hICMP_DLL);
return FALSE;
}
pIpe->Data = acPingBuffer;
pIpe->DataSize = sizeof(acPingBuffer);
// Send ping packet
dwRet = lpfnIcmpSendEcho(hICMP,
ip,
acPingBuffer,
sizeof(acPingBuffer),
NULL,
pIpe,
sizeof(IP_ECHO_REPLY)+sizeof(acPingBuffer),
TIMEOUT
);
GlobalFree(pIpe);
lpfnIcmpCloseHandle(hICMP);
FreeLibrary(hICMP_DLL);
if (dwRet == 0)
{
return FALSE;
}
return TRUE;
}