2012-02-04 2 views
0

기본 UDP 클라이언트 - 서버 프로그램을 작성 중이며 getbyhostname()에서 예상되는 결과를 얻지 못했습니다. 다음은 코드에서 가져온 코드입니다.getbyhostname()은 어떻게 작동합니까?

char *clientHostName = malloc(HOST_NAME_MAX); 
gethostname(clientHostName, HOST_NAME_MAX); 
printf("%s\n",clientHostName); 
struct hostent thehost = gethostbyname(clientHostName); 
printf("%ld\n",(*((unsigned long *) thehost->h_addr_list[0]))); 

이렇게 첫 번째 print 문은 내 컴퓨터의 이름을 출력합니다. 그러나 두 번째 print 문이 내 IP 주소를 출력 할 것으로 예상됩니다. 그러나 아니요, 다음과 같은 내용을 인쇄합니다 : 4398250634. 인쇄하는 것은 무엇입니까? 내 IP 주소는 어떻게 얻습니까?

답변

7

우선, gethostbyname 인터페이스를 사용하지 않아야합니다. 그것은 비추천이고 2012 년 현실 세계에서 실용적인 쇼 스토퍼 인 IPv6를 다룰 수 없습니다. 사용할 적절한 인터페이스는 getaddrinfo입니다. getaddrinfo을 사용하여 소켓 주소 형식의 호스트 이름을 찾은 다음 NI_NUMERICHOST 플래그와 함께 getnameinfo 플래그를 사용하여 인쇄 가능한 IP 주소 양식으로 변환 할 수 있습니다. 이는 IPv4 또는 IPv6 또는 이후의 모든 프로토콜에서 작동합니다.

특정 인쇄 문제에 대해서는 어떻게 %ld에서 IP 주소를 인쇄 할 것으로 예상합니까? 10 진수 (기본 10)의 단일 숫자 (long)를 인쇄합니다. 대신 포인터를 unsigned char *으로 캐스팅하고 각각이 %d으로 인쇄 될 4 개의 요소를 읽을 수 있지만 이는 잘못된 접근입니다.

+0

그래서 IP 인쇄에 대한 좋은 접근 방법은 무엇입니까? – batbrat

+1

'NI_NUMERICHOST' 플래그로'getnameinfo'를 사용하여 문자열로 변환 한 다음 문자열처럼 인쇄하십시오 (예 :'printf ("ip address : % s \ n", str);)) –

+0

고맙습니다. 감사합니다 :) – batbrat

3

호출중인 함수와 검사중인 필드는 IP 주소의 세그먼트에 포함 된 각 8 비트 8 진수와 함께 32 비트 변수를 제공합니다. 다음 코드 : 내 분투 상자에

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <netdb.h> 

#define HOST_NAME_MAX 1024 

int main (void) { 
    char *clientHostName = malloc(HOST_NAME_MAX); 
    gethostname(clientHostName, HOST_NAME_MAX); 
    printf("%s\n",clientHostName); 
    struct hostent *thehost = gethostbyname(clientHostName); 
    printf("%ld\n",(*((unsigned long *) thehost->h_addr_list[0]))); 
    printf("%08lx\n",(*((unsigned long *) thehost->h_addr_list[0]))); 
    return 0; 
} 

이 제공 : 당신이 01, 01, 007f에 마지막에 그 16 진수를 무너 뜨리는 경우,

formaldehyde 
16842879 
0101007f 

을하고, 그 역순으로 (의 내 CPU로 인해) 127.0.1.1, 루프백 주소 중 하나.