을 얻는 방법을 내 루프백 네트워크의 ip 주소에서 C?
-
05-07-2019 - |
문제
커뮤니케이션을 위해 사이에 두 개의 호스트가 필요를 보내는 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 주소는 경우에는 그 질문에 대한 답변 당신에게 말을 얻는 방법 중 하나는 인터넷에 노출되어 있습니다.
는 경우에도 컴퓨터 단 하나 실제 네트워크 인터페이스(가정을 수 있는지도,넷북 두-ethernet,WLAN),Vpn 을 추가할 수 있는 더 많은 IP 주소.어쨌든 호스트에서 다른 쪽지 결정할 수 있어야 합 IP 호스트를 연결하는 데 사용된다.
당신이 거의가 있습니다.나는 확실하지 않는 방법 당신 my_ip
서 hp
.
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 */
};