2012-02-17 6 views
0

IP4와 IP6 주소 모두에서 작동하는 함수가 필요하며 주소를 문자열 표현 (IP4) 또는 16 진수 표현 (IP6)에서 긴 값으로 변환해야합니다. 내가 가진 현재의 코드는 다음과 같습니다C에서 IP4 및 IP6 주소를 긴 값으로 변환하는 방법은 무엇입니까?

struct addrinfo *addr; 
// This converts an char* ip_address to an addrinfo, so now I know whether 
// it's a IP4 or IP6 address 
int result = getaddrinfo(ip_address, NULL, NULL, &addr); 
if (result ==0) { 
    struct in_addr dst; 
    result = inet_pton(addr->ai_family, ip_address, &dst); 
    long ip_value = dst->s_addr; 
    freeaddrinfo(addr); 
    return ip_value; 
} 

나는 dst->의 s_addr에서 긴받을 수 있나요하지만 난이 잘못되었다고 확신합니다. 이 문제를 해결하는 방법에 대한 모든 조언을 많이드립니다! 모든 dst

답변

1

첫째는 IPv6 주소 충분하지 않은 : 주소는 IPv4의입니다

unsigned char buf[sizeof(struct in6_addr)]; /* Since it's larger than in_addr */ 
int result = getaddrinfo(ip_address, NULL, NULL, buf); 

경우, bufuint32_tin_addr이다.

uint32_t u; 
memcpy(&u, buf, sizeof(u)); 

는 주소는 IPv6은 사실 ​​이해가되지 않습니다 long로 전환됩니다. 128 비트가 필요하거나 직접 롤백해야합니다. 마지막 비트는 그렇게 쉽지 않으므로 직접 물어보십시오. 이 필요하십니까?

+0

안녕하세요. 도움을 많이 주셔서 감사합니다. 내 inet_pton 호출이 잘못되었다고 말하면 getaddrinfo 호출을 의미합니까? IP6에 대해서, 그렇습니다. 128 비트가되어야합니다. 우리가 이것을 필요로 할 것이므로, 지금 고칠 것입니다. inet_pton 호출도 수정해야합니까? – DrDee

+0

@DrDee 죄송합니다. 질문을 잘못 읽었습니다. 귀하의'inet_pton' 전화는 실제로 거의 정확합니다, 나는 나의 대답을 편집했다. – cnicutar

+0

buf에있는 값은 항상 140734799738144 (sizeof struct in6_addr 인 것 같습니다)입니다. 계속 묻는 것에 대해 유감스럽게 생각하지만 여기에서 IP 주소의 '긴'표현을 어떻게 얻을 수 있습니까? – DrDee

관련 문제