blob: 755cc9c88a6f71c1f996a657599a4a103d5e9d81 [file] [log] [blame]
/*************************************************************************
*
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**************************************************************************/
#pragma pack(4)
#ifdef _AFXDLL
#include "stdafx.h"
#include <winsock2.h>
#else
#include <windows.h>
#endif
#include "ping.h"
#include "iputils.h"
/*
long ping( char* ObjRef )
{
char *pSendBuf = "CHAOS is a good thing!";
WORD wSendLen = (WORD)strlen(pSendBuf);
DWORD dwReplyLen = sizeof(ICMP_ECHO_REPLY) + max(wSendLen, 8);
char pReplyBuf[ sizeof(ICMP_ECHO_REPLY) + 30 ];
HANDLE hIcmp;
BOOL bResult;
char IpAddress[100];
ULONG PingIpAddress;
int Timeout = PING_TIMEOUT;
WSADATA wsaData;
int nCount = 0;
icmp_echo_reply *icmpReplyBuf;
IpAddress[0] = '\0';
for( unsigned int i=0; i < strlen( ObjRef ); i++ )
{
if( ObjRef[ 4 + i ] == '/'){
IpAddress[ i ] = 0;
break;
}
else
IpAddress[ i ] = ObjRef[ 4 + i ];
}
if( strspn( IpAddress, "0123456789." ) != strlen( IpAddress) )
{
char IpHost[100];
strcpy(IpHost,IpAddress);
if(MapNetBiosNm2IpAddress(IpHost,IpAddress)!=0)
return INADDR_NONE;
}
PingIpAddress = inet_addr( IpAddress );
if (PingIpAddress == INADDR_NONE) {
return INADDR_NONE; // cannot ping an invalid address
}
if (WSAStartup(MAKEWORD(1,1),&wsaData) != 0)
return GetLastError();
// Open ICMP channel
hIcmp = IcmpCreateFile();
if (hIcmp == INVALID_HANDLE_VALUE) { // Kijken: not really a problem
WSACleanup( );
return ERROR_INVALID_HANDLE; // Kijken: with the NIC. should this be TRUE.
}
while(1) {
if( nCount++==4) break;
// Send echo
bResult = IcmpSendEcho(hIcmp, PingIpAddress, pSendBuf, wSendLen, NULL, pReplyBuf,
dwReplyLen, Timeout);
if (bResult) // If reply comes back, let us check the fist reply
{
icmpReplyBuf = (icmp_echo_reply *)pReplyBuf;
if ((icmpReplyBuf->Status != 0) ||
(icmpReplyBuf->Status == 0 && (icmpReplyBuf->DataSize != wSendLen
|| strncmp((char *)icmpReplyBuf->Data, pSendBuf, wSendLen) != 0)))
{
Sleep(PING_SLEEP);
continue;
}
else
{
(void) IcmpCloseHandle(hIcmp);
WSACleanup( );
return ERROR_SUCCESS;
}
}
else
{
Sleep(PING_SLEEP);
continue;
}
}
// Bookkeeping
(void) IcmpCloseHandle(hIcmp);
WSACleanup( );
return WSAETIMEDOUT;
}
*/
#ifdef AFXDLL
#define _AFXDLL
#undef AFXDLL
#endif