| /*************************************************************************
|
| *
|
| // @@@ 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
|
|
|