2014-11-13 2 views
-1

어떻게 ICMP를 사용하여 서브넷 주소를 얻을 수 있는지 이해하려고합니다. Wikipedia (다른 출처에도 있음)에는 메시지 예제가 있지만 찾을 수 있었던 것은이 메시지와 아무 관련이 없습니다.Icmp 서브넷 주소 요청

IcmpSendEcho (msdn example)를 사용해 보았습니다. 그러나 그것이 틀린 경우에만 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에서 답을 얻을. 하지만 서브넷 주소를 가져야하고 그 주소가 필요합니다.

+0

코드를 게시하십시오. – GingerPlusPlus

+0

책, 도구, 소프트웨어 라이브러리, 자습서 또는 기타 오프 사이트 리소스를 추천하거나 찾도록 요청하는 질문은 독단적 인 답변과 스팸을 끌어 들이기 때문에 스택 오버플로에 대해 주제를 벗어났습니다. 대신 문제를 설명하고 지금까지 해결 된 문제를 설명하십시오. –

답변

0

ECHO (일명 핑)은 특정 유형의 ICMP 요청입니다. ICMP는 다른 유형의 메시지를 지원하지만 IcmpSendEcho()ECHO 개의 요청 만 보낼 수 있으며 따라서 ECHO 개의 응답을받을 수 있습니다. 따라서 서브넷 주소를 얻으려면 라우터에 ADDRESS MASK 요청을 보내기 위해 사용할 수 없습니다.

Microsoft는 범용 ICMP 요청을 보낼 수있는 API가 없습니다. SOCK_RAW 유형의 프로토콜과 IPPROTO_ICMP (ICMP는 IP 위에 있지만 TCP/UDP와는 별도로 실행 됨) 소켓을 만들려면 표준 소켓 API (Windows의 경우 WinSock)를 사용해야하며 수동으로 구성 할 수 있습니다 자신의 ICMP 요청을 보낸 다음 ICMP 응답을 읽고 구문 분석합니다. SOCK_RAW에는 Windows를 포함한 대부분의 플랫폼에서 관리자 권한이 필요합니다.

은 컴퓨터의 서브넷 주소를 얻기 위해 ICMP를 사용해야합니다. OS는 이미 그것을 알고 있으며 Windows에서 GetAdaptersInfo()GetAdaptersAddresses(), POSIX 시스템에서는 getifaddrs()과 같은 정보를 얻을 수있는 OS 고유의 API가 있습니다.

+0

고마워, 내가 살펴볼거야 / – Shushuka

관련 문제