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; }