2013-10-04 2 views
0

여기에 무선 en1의 IP 주소를 보내고 출력하는 내 기능이 있습니다.My Get IP Address C 함수가 올바른 값을 출력하지 않습니다.

char* getIPAddress(char* src) 
{ 

    struct ifaddrs *ifaddr, *ifa; 
    int family; 

    if (getifaddrs(&ifaddr) == -1) { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { 
     if (ifa->ifa_addr == NULL) 
      continue; 
     family = ifa->ifa_addr->sa_family; 
     if (0 == strcmp(ifa->ifa_name,"en1") && (family == AF_INET)) { // v4 
      // en1 

      inet_ntop(ifa->ifa_addr->sa_family,&((struct sockaddr_in*)ifa)->sin_addr,src,sizeof(struct sockaddr_in)); 
     } 
    } 

    freeifaddrs(ifaddr); 
    return src; 
} 

나는 129.10.10.50과 비슷한 것을 기대하지만, 지금은 공백으로 출력됩니다.

+0

잠시 동안 연결이 비활성 상태이면이 문제가 발생할 수 있습니다. 일반적으로 더미 패킷을 보내는 것은 그 문제를 해결합니다. "en1"문자열이 "en0"으로되어 있는지 확실하지 않습니다 ... 여러 개의 어댑터가 없으면 이전에 보았던 것입니다. ... 리눅스에서/proc/net/arp를 사용할 수 있습니다 – technosaurus

+0

'inet_ntop()'호출로'if' 문이 실제로 true로 평가되어 실행되는지 여부를 확인 했습니까? –

답변

2

이 잘못된 : 당신은 대신의 struct sockaddr_instruct ifaddrs을 캐스팅

inet_ntop(
    ifa->ifa_addr->sa_family, 
    &((struct sockaddr_in*)ifa)->sin_addr, // <--- casting wrong variable 
    src, 
    sizeof(struct sockaddr_in) 
); 

있어 회원이 그것을 해결됩니다

struct ifaddrs { 
    struct ifaddrs *ifa_next; /* Next item in list */ 
    char   *ifa_name; /* Name of interface */ 
    unsigned int  ifa_flags; /* Flags from SIOCGIFFLAGS */ 

    struct sockaddr *ifa_addr; /* Address of interface */ // <--- this one 

    struct sockaddr *ifa_netmask; /* Netmask of interface */ 
    union { 
     struct sockaddr *ifu_broadaddr; 
         /* Broadcast address of interface */ 
     struct sockaddr *ifu_dstaddr; 
         /* Point-to-point destination address */ 
    } ifa_ifu; 
#define    ifa_broadaddr ifa_ifu.ifu_broadaddr 
#define    ifa_dstaddr ifa_ifu.ifu_dstaddr 
    void   *ifa_data; /* Address-specific data */ 
}; 

:

inet_ntop(
    ifa->ifa_addr->sa_family, 
    &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr, // ifa_addr member instead 
    src, 
    sizeof(struct sockaddr_in) 
); 

또한 루프에서 빠져 나올 수도 있습니다.

+0

inet_ntop 함수를 한 단계 씩 실행하려고 할 때 "memmove $ VARIANT $ sse3x() at 0x7fff86e75ee2"소스를 사용할 수 없습니다. – lilzz

+0

coliru에서 테스트 코드를보고 실행하십시오. http://coliru.stacked-crooked.com/a/bd2889fc9d4bc07f – goji

+0

호스트의 IP를 콘솔에 올바르게 출력합니다. – goji

관련 문제