gethostname 예제

gethostname 함수는 이름 매개 변수에 의해 지정 된 버퍼에 로컬 호스트의 이름을 반환 합니다. 호스트 이름은 null 종료 된 문자열로 반환 됩니다. 호스트 이름의 형식은 Windows Sockets 공급자에 따라 달라지며 간단한 호스트 이름이거나 정규화된 도메인 이름일 수 있습니다. 그러나 반환된 이름은 gethostbyname 및 WSAAsyncGetHostByName에 의해 성공적으로 구문 분석됩니다. gethostname 함수는 Svgguid.h 헤더 파일에 정의된 SVCID_HOSTNAME GUID를 사용하여 로컬 호스트 이름을 결정하기 위해 네임스페이스 공급자를 쿼리합니다. 네임스페이스 공급자가 응답하지 않으면 gethostname 함수는 로컬 컴퓨터의 NetBIOS 이름을 반환합니다. 매개 변수 이름은 호스트 이름을 보유하는 버퍼를 가리키고 len은 해당 버퍼의 크기가 바이트입니다. gethostname()는 버퍼의 끝을 덮어쓰지 않으며(오류를 반환하거나 쓰기를 중지할 수도 있음) 버퍼에 해당 문자열이 있을 경우 NUL-종료문자열을 종료합니다. gethostname 함수가 Windows Server 2008, Windows Server 2003 또는 Windows 2000 Server및 CLUSTER_NETWORK_NAME 환경 변수의 클러스터 리소스에서 사용되는 경우 이 환경 변수의 값이 실제 호스트 이름을 재정의합니다.

반환됩니다. 클러스터 리소스에서 CLUSTER_NETWORK_NAME 환경 변수에는 클러스터 이름이 포함됩니다. 다음은 호스트 명령을 에뮬레이트하는 gethostbyname()을 사용하는 간단한 예제입니다. DNS 문제를 디버깅하기 위해 작성했습니다. (지금 현재 네트워크상에서 gethostbyname()은 호스트와 발굴과는 다른 답변을 반환합니다. 다른 호스트 이름을 지나치게 캐싱하는 것입니다. 즉, 폴루쿠쿠크 shrub.ca 17.250.248.64를 반환하고 있으며, 이는 mail.mac.com(!) 쿼리 설정은 이전 예제와 매우 유사합니다. 가장 눈에 띄는 변화는 미리 정의된 GUID SVCID_INET_ HOSTADDRBYNAME을 사용한다는 것입니다. 호스트 이름 쿼리를 식별하는 GUID입니다.

lpszServiceInstanceName은 해결하려는 호스트 이름입니다. DNS를 통해 호스트 이름을 해결하기 때문에 dwNameSpace에 대한 NS_DNS만 지정해야 합니다. 마지막으로 lpafProtocols는 TCP/IP 및 UDP/IP 프로토콜을 쿼리에 관심이 있는 프로토콜로 정의하는 두 개의 AFPROTOCOLS 구조의 배열로 설정됩니다. 쿼리를 설정하면 WSALookupServiceNext()를 호출하여 데이터를 반환할 수 있습니다. HOSTENT 구조가 BLOB 데이터로 반환되면 구조내의 포인터는 실제로 데이터가 있는 메모리로 오프셋됩니다. 오프셋은 BLOB 데이터의 시작 부분부터 시작되어 데이터에 액세스하기 전에 절대 메모리 위치를 참조하도록 포인터를 수정해야 합니다. 그림 8-1은 반환된 HOSTENT 구조 및 메모리 레이아웃을 보여 주며, DNS 쿼리는 단일 IP 주소와 별칭이 없는 호스트 이름 riven에서 수행됩니다. 구조의 각 필드에는 오프셋 값이 있습니다. 필드가 올바른 위치를 참조하도록 이 문제를 해결하려면 HOSTENT 구조체의 헤드 주소에 오프셋 값을 추가해야 합니다. h_name, h_aliases 및 h_addr_list 필드에서 이 작업을 수행해야 합니다. 또한 h_aliases 및 h_addr_list 필드는 포인터의 배열입니다. 포인터 배열에 대한 올바른 포인터를 얻으면 참조 위치의 각 32비트 필드는 오프셋으로 구성됩니다.

그림 8-1의 h_addr_list 필드를 살펴보면 초기 오프셋이 16바이트이며 HOSTENT 구조가 끝난 후 바이트를 참조하는 것을 볼 수 있습니다.

Share on Google+Share on FacebookTweet about this on Twitter
error: Садржај је заштићен !!