Я пытаюсь понять, как я могу получить адрес подсети с помощью ICMP. в Википедия (также из других источников), есть пример сообщения, но все, что я смог найти, не имеет ничего общего с этим сообщением.
Пытался использовать IcmpSendEcho (из MSDN пример), но мне показалось, что он выполняет только функцию ping, поправьте меня, если я не прав.
Можете ли вы привести пример кода (c / c ++) или ссылки?
Редактировать:
Код, который я использовал:
int __cdecl main() {
// Declare and initialize variables
HANDLE hIcmpFile;
unsigned long ipaddr = INADDR_NONE;
DWORD dwRetVal = 0;
char SendData[12] = "Data Buffer";
LPVOID ReplyBuffer = NULL;
DWORD ReplySize = 0;
ipaddr = inet_addr("217.71.130.248");
hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE) {
printf("\tUnable to open handle.\n");
printf("IcmpCreatefile returned error: %ld\n", GetLastError());
return 1;
}
ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
ReplyBuffer = (VOID*)malloc(ReplySize);
if (ReplyBuffer == NULL) {
printf("\tUnable to allocate memory\n");
return 1;
}
dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000);
if (dwRetVal != 0) {
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
struct in_addr ReplyAddr;
ReplyAddr.S_un.S_addr = pEchoReply->Address;
printf("\tSent icmp message to %s\n", "217.71.130.248");
printf("\tReceived %ld icmp message response\n", dwRetVal);
printf("\tInformation from this response:\n");
printf("\t Received from %s\n", inet_ntoa(ReplyAddr));
printf("\t Status = %ld\n",
pEchoReply->Status);
printf("\t Roundtrip time = %ld milliseconds\n",
pEchoReply->RoundTripTime);
}
else {
printf("\tCall to IcmpSendEcho failed.\n");
printf("\tIcmpSendEcho returned error: %ld\n", GetLastError());
return 1;
}
return 0;
}
Я получаю ответ от IP, который работает хорошо. Но мне нужно получить адрес подсети, и я застрял на нем
ECHO
(aka ping) — это определенный тип ICMP-запроса. ICMP поддерживает другие типы сообщений, но IcmpSendEcho()
можно только отправить ECHO
запросы и получать ECHO
отвечает, отсюда и его название. Таким образом, вы не можете использовать его для отправки ADDRESS MASK
запрос к вашему роутеру, чтобы получить адрес подсети.
У Microsoft нет API для отправки ICMP-запросов общего назначения. Вы должны будете использовать стандартный API сокетов (WinSock на Windows), чтобы создать сокет с типом SOCK_RAW
и протокол IPPROTO_ICMP
(поскольку ICMP работает поверх IP, но отделен от TCP / UDP), вы можете вручную создавать и отправлять свои собственные запросы ICMP, а затем читать и анализировать ответы ICMP. Имейте в виду, что SOCK_RAW
требует прав администратора на большинстве платформ, включая Windows.
Как говорится, вы не делайте Нужно прибегнуть к ICMP, чтобы получить адрес подсети вашего компьютера. ОС уже знает это, и есть специальные API для ОС, чтобы получить эту информацию, такие как GetAdaptersInfo()
а также GetAdaptersAddresses()
в Windows и getifaddrs()
в системах POSIX.