문제

커뮤니케이션을 위해 사이에 두 개의 호스트가 필요를 보내는 IP 주소의 내 호스트를 다른 사이트입니다.문제는다면 요청의 IP 주소를 사용할 수 없을 수도 있습 다시 얻을 내 local loopback IP 주소(127.x.x.x),네트워크(이더넷)에 IP 주소입니다.

나는 다음과 같은 코드를 사용:

char myhostname[32];


gethostname(myhostname, 32);
hp = gethostbyname(myhostname);
unsigned my_ip = *(unsigned*)(hp->h_addr);

if( (my_ip % 256) == 127) {
  /* Wrong IP adress as it's 127.x.x.x */
  printf("Error, local IP address!");
  return;
}

를 해결할 수 있는 유일한 방법은 그것은을 확인하는 내 호스트명에는/etc/hosts 뒤에 실제 네트워크 주소지,로컬 루프백(기본값에 대한 예Ubuntu).

이 있을 해결하는 방법 이에 의존하지 않고 내용의/etc/hosts?

편집: 나는 변경된 위의 코드는 그래서 그것의 사용 getaddrinfo,하지만 나는 아직도 다시 얻을 수있는 루프백 기기의 번호(127.0,0,1)자신의 실제 IP 주소:

struct addrinfo hint = {0};
struct addrinfo *aip = NULL;
unsigned ip = 0;
struct sockaddr_in *sinp = NULL;

hint.ai_family = AF_INET; /* IPv4 */
hint.ai_socktype = SOCK_STREAM;

if(getaddrinfo(hostname, NULL, &hint, &aip) != 0) {
    return 0;
}
sinp = (struct sockaddr_in *) aip->ai_addr;
ip   = *(unsigned *) &sinp->sin_addr;

(내가 사용하는 다시 얻을 수있는 목록의 3addrinfo 의 세 SOCK_STREAM,SOCK_DGRAM 및 SOCK_RAW 지만,힌트는 것을 방지합니다)

그래서 제 질문은 여전히...

도움이 되었습니까?

해결책

가 POSIX 기능 getaddrinfo() 를 반환하는 링크 목록의 주소를 지정된 호스트,그래서 당신은 그냥 통과해야 하는 목록을 찾아 비 루프백 주소입니다.

man getaddrinfo.

다른 팁

대답이 아니지만,관련 논평:알고 있는 한 빨리 너를 보내기 시작 주소는 정보의 내용에 패킷의 위험을 실행하 응용 프로그램에서 작동할 수 없 NAT:ing 라우터 및/또는 방화벽에서도 그대로 적용됩니다.

이러한 기술은 정보에 의존에서 IP 패킷 헤더를 추적하는 트래픽의 경우 응용 프로그램 교환 addressing 내부 정보는 패킷을,그들이 어디에 남아있는 보이지 않는 이를 검사할 수 있습니다.

물론,이 될 수 있을 완전히 관련 응용 프로그램,생각 하지만 그것에 가치를 지니다.

원래의 주소를 포함됩에서 패킷 전송되...할 필요가 없을 중복 이 정보입니다.그것은 얻을 수용 할 때 communication 원격 호스트에서(참조하십시오 beej 의 가이드는 네트워킹,특히 부에 동())

나는 상황으로면/etc/hosts 은 정보에 그것을 사용할 때 나는 getaddrinfo 을 얻은 IP 주소 목록을 반환 127.0.0.1 습니다.로,호스트명이었는 별칭을 localhost...뭔가 종종 간과 하기 쉽습니다.여기에 무슨 일이 있었는지:

/Etc/hosts file:
127.0.0.1localhost.localdomain localhost foo
::1localhost6.localdomain6localhost6
172.16.1.248foo
172.16.1.249bie
172.16.1.250bletch

따라서,지금,호출할 때 getaddrinfo host="foo",그것은 반환 127.0.0.1 3 번입니다.에 오류가 여기에는 foo 나타납니다 모두에선"127.0.0.1"및"172.16.1.248".일단 제거 foo 라인에서와 함께"127.0.0.1"일했다.

희망이 누군가가 도움이 됩니다.

이보:을 발견하는 공 IP 프로그래밍 방식으로

어떤 경우에는 컴퓨터에 있을 수 있는 하나 이상의 비 루프백 IP 주소는 경우에는 그 질문에 대한 답변 당신에게 말을 얻는 방법 중 하나는 인터넷에 노출되어 있습니다.

는 경우에도 컴퓨터 단 하나 실제 네트워크 인터페이스(가정을 수 있는지도,넷북 두-ethernet,WLAN),Vpn 을 추가할 수 있는 더 많은 IP 주소.어쨌든 호스트에서 다른 쪽지 결정할 수 있어야 합 IP 호스트를 연결하는 데 사용된다.

당신이 거의가 있습니다.나는 확실하지 않는 방법 당신 my_iphp.

gethostbyname() 포인터를 반환합 hostent 구조가 h_addr_list 다.

h_addr_list 필드가 null 로 끝나는 목록의 모든 ip 주소 바인딩하는 호스트.

내가 생각하는 당신 루프백 주소기 때문에 그것은 첫 번째 항목 h_addr_list.

편집:그것은 무언가를 다음과 같다:

gethostname(myhostname, 32);
hp = gethostbyname(myhostname);
unsigned my_ip = *(unsigned*)(hp->h_addr);

for (int i = 0; hp->h_addr_list[i] != 0; ++i) {
  if (hp->h_addr_list[i] != INADDR_LOOPBACK) {
    // hp->addr_list[i] is a non-loopback address
  }
}
// no address found

면/etc/hosts 은 여전히 존재하고 여전히 동일하고 모든 항목에 대해의 h_addr_list 도움이되지 않습니다.

새 코드 hardwires 의 사용 IPv4(에서 힌트입니다.ai_family 필드)는 끔찍한 생각입니다.

그 외에도에서,당신은 가까이 있다,당신은 단지 반복의 결과를 통해 getaddrinfo.귀하의 코드를 가져옵 첫 번째 IP 주소만 있 aip->ai_next 필드를 따라...

struct addrinfo {
       ...
       struct addrinfo *ai_next;       /* next structure in linked list */
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top