2014-11-13 4 views
-1

Я пытаюсь понять, как я могу получить адрес подсети, используя ICMP. В Wikipedia (другие источники также) есть пример сообщения, но все, что я смог найти, не имеет ничего общего с этим сообщением.Запрос адреса подсети Icmp

Пытался использовать IcmpSendEcho (от msdn example), но мне показалось, что он выполняет только функцию ping, исправьте меня, если я ошибаюсь.

Можете ли вы привести мне пример кода (c/C++) или ссылки?

Edit:

Код я использовал:

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

+0

Пожалуйста, внесите ваш код. – GingerPlusPlus

+0

Вопросы, предлагающие нам рекомендовать или находить книгу, инструмент, библиотеку программного обеспечения, учебное пособие или другие ресурсы за пределами сайта, не относятся к теме для переполнения стека, поскольку они, как правило, привлекают упрямые ответы и спам. Вместо этого опишите проблему и то, что было сделано до сих пор, чтобы ее решить. –

ответ

0

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, чтобы получить адрес подсети вашей машины. OS уже знает об этом, и для получения этой информации доступны такие специфичные для ОС API, как GetAdaptersInfo() и GetAdaptersAddresses() в Windows и getifaddrs() на системах POSIX.

+0

Спасибо, я загляну в него / – Shushuka