windows-nt/Source/XPSP1/NT/termsrv/setup/tsdiag/dll/ping.cpp
2020-09-26 16:20:57 +08:00

131 lines
2.7 KiB
C++

// ping.cpp
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <snmp.h>
#include <winsock2.h>
#include "llinfo.h"
//#include "tcpcmd.h"
#include "ipexport.h"
#include "icmpapi.h"
//#include "nlstxt.h"
#include "Icmpapi.h"
#include "tstst.h"
#include "testdata.h"
unsigned long get_pingee(char *ahstr, char **hstr, int *was_inaddr, int dnsreq)
{
struct hostent *hostp = NULL;
long inaddr;
if ( strcmp( ahstr, "255.255.255.255" ) == 0 ) {
return(0L);
}
if ((inaddr = inet_addr(ahstr)) == -1L) {
hostp = gethostbyname(ahstr);
if (hostp) {
/*
* If we find a host entry, set up the internet address
*/
inaddr = *(long *)hostp->h_addr;
*was_inaddr = 0;
} else {
// Neither dotted, not name.
return(0L);
}
} else {
// Is dotted.
*was_inaddr = 1;
if (dnsreq == 1) {
hostp = gethostbyaddr((char *)&inaddr,sizeof(inaddr),AF_INET);
}
}
*hstr = hostp ? hostp->h_name : (char *)NULL;
return(inaddr);
}
bool CanPing ()
{
if (!CTSTestData::GetMachineName())
return true;
USES_CONVERSION;
const Timeout = 4000L;
WSADATA WsaData;
if (WSAStartup( 0x0101, &WsaData))
{
return false;
}
HANDLE IcmpHandle;
IcmpHandle = IcmpCreateFile();
if (IcmpHandle == INVALID_HANDLE_VALUE)
{
return false;
}
char *hostname = NULL;
int was_inaddr;
int dnsreq = 0;
IPAddr address = 0;
address = get_pingee(T2A(CTSTestData::GetMachineName()), &hostname, &was_inaddr, dnsreq);
if ( !address || (address == INADDR_NONE) )
{
return false;
}
const SendSize = 32;
const RecvSize = 0x2000 - 8;
char *SendBuffer = (char *)LocalAlloc(LMEM_FIXED, SendSize);
char *RcvBuffer = (char *)LocalAlloc(LMEM_FIXED, RecvSize);
if (!RcvBuffer || !SendBuffer)
{
if (RcvBuffer)
LocalFree(RcvBuffer);
if (SendBuffer)
LocalFree(SendBuffer);
return false;
}
IP_OPTION_INFORMATION SendOpts;
SendOpts.OptionsData = NULL;
SendOpts.OptionsSize = 0;
SendOpts.Ttl = 128;
SendOpts.Tos = 0;
SendOpts.Flags = 0;
if (IcmpSendEcho2(IcmpHandle,
0,
NULL,
NULL,
address,
SendBuffer,
(unsigned short) SendSize,
&SendOpts,
RcvBuffer,
RecvSize,
Timeout) == 0)
{
return false;
}
IcmpCloseHandle(IcmpHandle);
LocalFree(SendBuffer);
LocalFree(RcvBuffer);
return true;
}