Запрос адреса подсети Icmp

Я пытаюсь понять, как я могу получить адрес подсети с помощью 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, который работает хорошо. Но мне нужно получить адрес подсети, и я застрял на нем

-1

Решение

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.

0

Другие решения


По вопросам рекламы [email protected]