2014-09-21 4 views
1

getaddrinfo()는 struct addrinfo을 채우고 실제 포장 된 주소는 struct sockaddr *ai_addr 필드에 저장됩니다. struct sockaddr은 실제 이진 주소 표현을 사용하는 char *sa_data 필드를 가지고 있습니다. 을 사용하여이 sa_data를 다른 변수에 복사하고 싶습니다.이 필드의 실제 길이를 알아야합니다.getaddrinfo()에 의해 반환 된 ai_addr-> sa_data의 실제 크기를 얻는 방법

나는 ai_addrlen이 내가 필요한 것이라고 생각한다. 그러나 실제로 IPv4의 경우 16, IPv6의 경우 28을 반환합니다. 너무 많이 생각합니다. 그럼, sa_data 길이를 얻는 가장 올바른 방법은 무엇입니까? length = sa_family == AF_INET ? 4 : 16 또는 length = ai_addrlen - 12 일 수 있습니까?

답변

3

getaddrinfo() 함수는 struct addrinfo 레코드로 구성된 링크 된 목록을 반환합니다. 각 레코드에는 struct sockaddr에 대한 포인터가 포함되어 있는데 그 뒤에는 다형성 유형이 있으며 그 뒤에는 struct sockaddr_in 또는 struct sockaddr_in6이 있습니다. ai_addrlen 회원은 구조가 얼마나 큰지를 알려줍니다. 즉 sizeof (struct sockaddr_in) 또는 sizeof (struct sockaddr_in6)을 반환합니다.

그 구조는 진 IP 주소를 포함, (물론 struct addrinfo 반복) 가족 및 기타 데이터 (flowinfo 및 IPv6에 대한의 scope_id (TCP 나 UDP와 같은 전송 프로토콜) 포트 번호는 리눅스 문서를 볼 때).

실제 이진 주소는 struct sockaddr_in이고 strict sockaddr_in6struct in_addr sin_addrstruct in6_addr sin6_addr입니다. 이러한 필드 또는 유형을 사용하여 크기를 결정할 수 있습니다.

length = sa_family == AF_INET ? sizeof (struct in_addr) : sizeof (struct in6_addr) 

알려진 숫자이므로 당연히 질문에있는 내용을 사용할 수 있습니다.

length = sa_family == AF_INET ? 4 : 16 

그러나 당신은 또한 ai_addrlen에를 arithmetics을하려고 노력하고 유형은 운영 체제에 따라 다를 수 있다는 점에서 어떤 논리가 어쨌든 없다으로 즉, 좋은 생각이 아니다. 특정 유스 케이스 또는 특정 코드가있는 경우 자세한 정보를 추가 할 수 있습니다.

+0

설명해 주셔서 감사합니다. –