www.pudn.com > network-java.rar > ping.cpp


// ping.cpp : Defines the entry point for the DLL application. 
// 
 
#include  
#include "stdafx.h" 
#include "ping.h" 
#include "netManager_discovery_IPSavingThread.h" 
#include  
#include  
#include  
#include "icmpdefs.h" 
#pragma	comment(lib, "Wsock32.lib") 
 
BOOL APIENTRY DllMain( HANDLE hModule,  
                       DWORD  ul_reason_for_call,  
                       LPVOID lpReserved 
					 ) 
{ 
    switch (ul_reason_for_call) 
	{ 
		case DLL_PROCESS_ATTACH: 
		case DLL_THREAD_ATTACH: 
		case DLL_THREAD_DETACH: 
		case DLL_PROCESS_DETACH: 
			break; 
    } 
    return TRUE; 
} 
 
 
// This is an example of an exported variable 
PING_API int nPing=0; 
 
// This is an example of an exported function. 
PING_API int fnPing(void) 
{ 
	return 42; 
} 
 
// This is the constructor of a class that has been exported. 
// see ping.h for the class definition 
CPing::CPing() 
{  
	return;  
} 
 
//==================ping的实现部分================== 
int doit(int argc, char* argv) 
{//[bugfree] 建议将这个argc和argv的处理拿到main函数中 
    // 检查命令行参数 
    if (argc < 2) { 
        //cerr << "usage: ping " << endl; 
        return 1; 
    } 
     
    // 装载ICMP.DLL连接库 
    HINSTANCE hIcmp = LoadLibrary("ICMP.DLL"); 
    if (hIcmp == 0) { 
        //cerr << "Unable to locate ICMP.DLL!" << endl; 
        return 2; 
    } 
 
    // 查找给定机器的IP地址信息 
    struct hostent* phe = gethostbyname(argv); 
	if (phe == 0) { 
        //cerr << "Could not find IP address for " << argv << endl; 
        return 3; 
    } 
	 
 
    // 定义函数三个指针类型 
    typedef HANDLE (WINAPI* pfnHV)(VOID); 
    typedef BOOL (WINAPI* pfnBH)(HANDLE); 
    typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD, 
            PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); // evil, no? 
    //定义三个指针函数 
    pfnHV pIcmpCreateFile; 
    pfnBH pIcmpCloseHandle; 
    pfnDHDPWPipPDD pIcmpSendEcho; 
     
    //从ICMP.DLL中得到函数入口地址 
    pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp,  "IcmpCreateFile"); 
    pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp, "IcmpCloseHandle"); 
    pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp, "IcmpSendEcho"); 
    if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) ||  
            (pIcmpSendEcho == 0)) { 
        //cerr << "Failed to get proc addr for function." << endl; 
        return 4; 
    } 
 
    // 打开ping服务 
    HANDLE hIP = pIcmpCreateFile(); 
    if (hIP == INVALID_HANDLE_VALUE) { 
        //cerr << "Unable to open ping service." << endl; 
        return 5; 
    } 
    
    // 构造ping数据包 
    char acPingBuffer[64]; 
    memset(acPingBuffer, '\xAA', sizeof(acPingBuffer)); 
    PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, 
            sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer));  
    if (pIpe == 0) { 
        //cerr << "Failed to allocate global ping packet buffer." << endl; 
        return 6; 
    } 
    pIpe->Data = acPingBuffer; 
    pIpe->DataSize = sizeof(acPingBuffer);       
 
    // 发送ping数据包 
    DWORD dwStatus = pIcmpSendEcho(hIP, *((DWORD*)phe->h_addr_list[0]),  
            acPingBuffer, sizeof(acPingBuffer), NULL, pIpe,  
            sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), 5000); 
    if (dwStatus != 0) { 
				cout << "Addr: " << 
                int(LOBYTE(LOWORD(pIpe->Address))) << "." << 
                int(HIBYTE(LOWORD(pIpe->Address))) << "." << 
                int(LOBYTE(HIWORD(pIpe->Address))) << "." << 
                int(HIBYTE(HIWORD(pIpe->Address))) << ", " << 
                "RTT: " << int(pIpe->RoundTripTime) << "ms, " << 
                "TTL: " << int(pIpe->Options.Ttl) << endl; 
				return dwStatus; 
    } 
    else { 
        //cout << dwStatus ; 
		return dwStatus; 
 
    } 
 
    // 关闭,回收资源 
    GlobalFree(pIpe); 
    FreeLibrary(hIcmp); 
    return 100; 
} 
 
/** 
 *JString 转换为 Char*; 
 */ 
char* createString(JNIEnv* env,jstring js) 
{ 
	if (js == NULL) 
		return NULL; 
	int len = env->GetStringLength(js); 
	char* s = new char[len*2+1]; 
	const jchar* cs = env->GetStringChars(js,NULL); 
	len = ::WideCharToMultiByte(CP_ACP,NULL, 
		cs,len,s,len*2+1,NULL,NULL); 
	s[len] = NULL; 
	env->ReleaseStringChars(js,cs); 
	return s; 
} 
 
JNIEXPORT jint JNICALL Java_netManager_discovery_IPSavingThread_ping(JNIEnv * env, jobject obj, jstring strIP){ 
		 
	char * str = createString(env,strIP); 
 
	WSAData wsaData; 
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { 
        return 255; 
    } 
 
    int retval = doit(2, str); 
 
    WSACleanup(); 
    return retval; 
}