首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言调用Ping下令

2013-03-26 
C语言调用Ping命令怎样用C语言调用Ping命令,并获得Ping后返回的字符串。[解决办法]引用:怎样用C语言调用Pin

C语言调用Ping命令
怎样用C语言调用Ping命令,并获得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;
}

热点排行