代码如下
//在link项中加ws2_32.lib#include <windows.h>
#include <WinSock.h>
#include <stdio.h>
#include <string.h>typedef struct tagIPINFO
{
u_char Ttl;
u_char Tos;
u_char IPFlags;
u_char OptSize;
u_char FAR *Options;
}IPINFO,*PIPINFO;typedef struct tagICMPECHO
{
u_long Source;
u_long Status;
u_long RTTime;
u_short DataSize;
u_short Reserved;
void FAR *pData;
IPINFO ipInfo;
}ICMPECHO,*PICMPECHO;HANDLE (WINAPI *pIcmpCreateFile)(VOID);
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
DWORD(WINAPI *pIcmpSendEcho)(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);void main(int argc,char **argv)
{
WSADATA wsaData;
ICMPECHO icmpEcho;
HANDLE hndlIcmp;
HANDLE hndlFile;
LPHOSTENT pHost;
struct in_addr Dest;
DWORD *dwAddress;
IPINFO ipInfo;
int nRet;
DWORD dwRet;
int x;

if(argc!=2)
{
fprintf(stderr,"\nSyntax:ping HostNameOrIPAddress\n");
return;
}
hndlIcmp=LoadLibrary("ICMP.DLL");
if(hndlIcmp==NULL)
{
fprintf(stderr,"\nCould not load ICMPDLL\n");
return;
}
pIcmpCreateFile=(HANDLE(WINAPI*)(void))GetProcAddress(hndlIcmp,"IcmpCreateFile");
pIcmpCloseHandle=(BOOL(WINAPI*)(HANDLE))GetProcAddress(hndlIcmp,"IcmpClossHandle");
pIcmpSendEcho=(DWORD(WINAPI*)(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))GetProcAddress(hndlIcmp,"icmpSendEcho");
    

if(pIcmpCreateFile==NULL  ||
pIcmpCloseHandle==NULL ||
pIcmpSendEcho==NULL)//运行到这里就停了,搞不懂,
{
fprintf(stderr,"\nError getting ICMP proc address\n");
FreeLibrary(hndlIcmp);
return;
}

//init WinSock
nRet=WSAStartup(MAKEWORD(1,1),&wsaData);
if(nRet)
{
fprintf(stderr,"\nWSAStartup() error:%d\n",nRet);
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
if(0x0101!=wsaData.wVersion )
{
fprintf(stderr,"\nWinSock versin 1.1 supported\n");
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}

Dest.S_un .S_addr =inet_addr(argv[1]);
if(Dest.S_un .S_addr ==INADDR_NONE)
pHost=gethostbyname(argv[1]);
else
pHost=gethostbyaddr((const char *)&Dest ,sizeof(struct in_addr),AF_INET);
if(pHost==NULL)
{
fprintf(stderr,"\n%s not found\n",argv[1]);
WSACleanup();
FreeLibrary(hndlIcmp);
return;
}
printf("\nPinging %s[%s]",pHost->h_name ,inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list [0])));

dwAddress=(DWORD*)(*pHost->h_addr_list );

hndlFile=pIcmpCreateFile();
for(x=0;x<4;x++)
{
ipInfo.Ttl =255;
ipInfo.Tos =0;
ipInfo.IPFlags =0;
ipInfo.Options =NULL;

dwRet=pIcmpSendEcho(hndlFile,
*dwAddress,
NULL,
0,
&ipInfo,
&icmpEcho,
sizeof(struct tagICMPECHO),
5000);
    Dest.S_un .S_addr =icmpEcho.Source;
printf("\nReply from %s Time=%ldms TTL=%d",
inet_ntoa(Dest),
icmpEcho.RTTime,
icmpEcho.ipInfo.Ttl);
if(icmpEcho.Status)
{
printf("\nError:icmpEcho.Status=%ld",icmpEcho.Status);
break;
}
}
printf("\n");
pIcmpCloseHandle(hndlFile);
FreeLibrary(hndlIcmp);
WSACleanup();

}
请帮帮忙找出问题,