2011-04-20 2 views
1

다음은 사용자가 입력 한 주소의 IP 주소를 표시하려는 코드입니다. 그러나 STATUS_ACCESS_VIOLATION을 표시하며 그 이유를 이해하지 못합니다.이 코드에 대한 도움말 (STATUS_ACCESS_VIOLATION 제공)

잘 컴파일됩니다. 여기있다.

#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif 

// Link to ws2_32.lib 
#include <winsock2.h> 
#include <stdio.h> 
#include <stdlib.h> 
struct protoent *proto=NULL; 
int main(int count, char *strings[]) 
{ 
    int pid; 
    struct hostent *host; 
    struct sockaddr_in addr; 
    if (count != 3) 
    { 
    printf("usage: %s <addr> < Adressflag = 0 for name and 1 for IP > /n", strings[0]); 
    exit(0); 
    } 
if (count == 3) 
{ 
    int flag = atoi(strings[2]); 
    printf("flag is %d",flag); 
    if (flag == 0) 
    { 
     pid = getpid(); 
     proto = getprotobyname("ICMP"); 
     host = gethostbyname(strings[1]); 
     bzero(&addr, sizeof(addr)); 
     addr.sin_family = host->h_addrtype; 
     addr.sin_port = 0; 
     addr.sin_addr.s_addr = *(long*)host->h_addr; 
     //traceroute(&addr); 
     printf("IP of %s is %s",host->h_name , host-> h_addr); 
    } 
    else 
    { 

    } 
} 
return 0; 
} 

나는 이것을 cygwin에서 돌리고있다. 누구든지 오류를 알고 누구든지 내가 뭘 잘못하고 있는지 말할 수 있습니까 ??

+1

귀하의 질문에 대한보다 유익한 제목을 선택하십시오. –

+0

디버거는 무엇을 말합니까? –

+0

@Tomalak cygwin에서 어떻게 실행하나요? –

답변

2

앞에 *가 실제로 필요합니까?

addr.sin_addr.s_addr = *(long*)host->h_addr 

즉 임의의 임의 주소를 참조 해제한다는 의미입니다.

너도 아니요, null을 확인하는 호스트입니다.

+0

만약 제가하지 않으면 나 할당 캐스팅없이 포인터에서 정수를 만드는 경고 ..... –

+1

@ user506710 : 귀하의 코드가 캐스트없이 깨진, 당신이 캐스트를 추가해야한다는 것을 의미하지는 않습니다. 캐스트를 사용하면 코드가 더 이상 손상되지 않지만 컴파일 타임에 숨길 수 있습니다. –

+0

주 비트가 작동 할 때까지 지금 모든 addr 코드를 제거하십시오. 내 말은 작동하지 않는 라인을 찾아 수정하는 것입니다. – ColWhi

0
addr.sin_addr.s_addr = *(long*)host->h_addr 

당신은 문자열의 숫자를 얻기 위해 char*long*에 캐스팅 할 수 없으며, 당신은 아마 중, 역 참조 할 수 없습니다.

관련 문제