2015-08-24 2 views
0

Я использовал ниже код. Он работает, но в режиме отладки в Visual Studio, если вы остановите отладку, компьютер дал синий экран, поэтому это не полезно. Я провел некоторое исследование, и я обнаружил, что это обычная ошибка для icmpapi. Есть ли способ пингования компьютера C++?Как я могу ping удаленный компьютер на моем компьютере с Windows с C++?

 #include <winsock2.h> 
     #include <iphlpapi.h> 
     #include <icmpapi.h> 

     //Declare and initialize variables 
     HANDLE hIcmpFile; 
     unsigned long ipaddr = INADDR_NONE; 
     DWORD dwRetVal  = 0; 
     DWORD dwError  = 0; 
     char SendData[]  = "Data Buffer"; 
     LPVOID ReplyBuffer = NULL; 
     DWORD ReplySize  = 0; 

     QByteArray ipArray = computerIt->GetIP().toLocal8Bit(); 
     const char *hostIP = ipArray.data(); 

     ipaddr = inet_addr(hostIP); 
     if (ipaddr == INADDR_NONE) 
     { 
      EventLogger::LogMessage(true, "<%s> Computer in <%s> Computer Group, IP initialization failed. (inet_addr(hostIP))", computerIt->GetName().toUtf8().constData(), computerGroupIt->GetName().toUtf8().constData()); 
      break; 
     } 

     hIcmpFile = IcmpCreateFile(); 
     if (hIcmpFile == INVALID_HANDLE_VALUE) 
     { 
      EventLogger::LogMessage(true, "<%s> Computer in <%s> Computer Group, IcmpCreatefile returned error", computerIt->GetName().toUtf8().constData(), computerGroupIt->GetName().toUtf8().constData()); 
      break; 
     } 

     // Allocate space for at a single reply 
     ReplySize = sizeof (ICMP_ECHO_REPLY) + sizeof (SendData) + 8; 
     ReplyBuffer = (VOID *) malloc(ReplySize); 
     if (ReplyBuffer == NULL) 
     { 
      EventLogger::LogMessage(true, "<%s> Computer in <%s> Computer Group, unable to allocate memory for reply buffer", computerIt->GetName().toUtf8().constData(), computerGroupIt->GetName().toUtf8().constData()); 
      break; 
     } 

     // Starting pinging 
     dwRetVal = IcmpSendEcho2(hIcmpFile, NULL, NULL, NULL, 
           ipaddr, SendData, sizeof (SendData), NULL, 
           ReplyBuffer, ReplySize, 1000); 
     if (dwRetVal == 0) 
     { 
      computerIt->SetAliveStatus(false); 
     } 
     else 
     { 
      computerIt->SetAliveStatus(true); 
     } 
+0

Вы должны создать сокеты (который ограничивается только администраторами) и самостоятельно внедрять ICMP. Цель ICMPAPI MS - это обработать это для вас, удалив ограничение администратора. Не могли бы вы привести источники, утверждающие, что это известная ошибка в icmpapi? –

+0

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c0d616a2-a1ea-43fb-831c-b1f51a957639/icmpsendech-blue-screen это показывает ошибку! Как я могу реализовать RAW-сокет, это настолько сложно, что вы можете показать мне пример! – EmreS

ответ

0

В приведенном выше коде есть ошибка в методе IcmpSendEcho2! Это видно только в режиме отладки! (См. Ссылку) https://msdn.microsoft.com/en-us/library/windows/desktop/aa366050(v=vs.85).aspx

Я использовал необработанные методы ping для операции ping. Это намного медленнее, но это безопасность!

Вы можете проверить необработанный метод пинг: http://tangentsoft.net/wskfaq/examples/rawping.html

Смежные вопросы