데비안 기반 시스템에서 프로그래밍 방식으로 IP 주소를 얻는 방법은 무엇입니까?
-
22-08-2019 - |
문제
나는 그것을 검색하려고한다 IP Address
내 프로그램의 로컬 컴퓨터의. 운영 체제입니다 Ubuntu 8.10
. 나는 사용을 시도했다 gethostname()
그리고 gethostbyname()
검색하려면 IP Address
. 내가받은 대답은 127.0.1.1
. 나는 그것이 인 것 같다는 것을 배웠다 Debian
물건:여기에 연결된 문서는 아이디어를 설명했습니다.
내 내용 /etc/hosts
파일은 다음과 같습니다.
127.0.0.1 로컬 호스트
127.0.1.1 Mymachine
이 경우 컴퓨터의 시스템 파일을 수정하지 않고 IP 주소를 가져 오기 위해 프로그래밍 방식 (C 또는 C ++ 선호)에 다른 방법이 있습니까?
해결책
"NetDevice"를 참조하십시오 man netdevice
또는 웹에서.
그런 다음 siocgifconf를 사용하여 모든 전송 계층 주소를 열거 할 수 있습니다.
편집 (맨 페이지) : man
Linux (또는 다른 Unix와 같은 시스템)에서 매우 유용한 명령입니다. 대부분의 명령, 라이브러리 기능, 프로그램 등에 대한 간단한 설명을 보여줍니다. 쉘 프롬프트 열기 및 유형 man ls
또는 man netdevice
, 그리고 당신은 내가 무슨 뜻인지 알 수 있습니다.
편집 (IP의 일반적인 검색) : C Way가 너무 지저분하다고 생각하면 가장 쉬운 방법은 (내 머리 꼭대기에서)와 같은 간단한 쉘 스크립트입니다.
ifconfig|grep 'inet addr'|awk '{print $2}'|sed 's/addr://g'
편집 (뇌 솔루션) : 그가하는 일은 if_nameindex () 모든 네트워크 장치 이름을 찾을 수있는 기능과 IP를 찾기 위해 각 이름의 SioCfifConf IOCTL을 찾을 수 있습니다. 그가 말했듯이, 장치 당 하나의 IP 만 나열합니다.
다른 팁
다음은 siocgifconf를 보여주는 빠르고 더러운 코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int sock, i;
struct ifreq ifreqs[20];
struct ifconf ic;
ic.ifc_len = sizeof ifreqs;
ic.ifc_req = ifreqs;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
perror("socket");
exit(1);
}
if (ioctl(sock, SIOCGIFCONF, &ic) < 0) {
perror("SIOCGIFCONF");
exit(1);
}
for (i = 0; i < ic.ifc_len/sizeof(struct ifreq); ++i)
printf("%s: %s\n", ifreqs[i].ifr_name,
inet_ntoa(((struct sockaddr_in*)&ifreqs[i].ifr_addr)->sin_addr));
return 0;
}
Linux 시스템에서 다음 출력을 얻습니다.
lo: 127.0.0.1
br0: 192.168.0.42
dummy1: 10.0.0.2
따라서 Ken의 요점에 따라 :
ip addr show scope global | grep inet | cut -d' ' -f6 | cut -d/ -f1
데비안 신들이 "IP"명령을 만들었을 때, 그들은 IP 주소 만 얻기 위해 간단한 명령을 추가한다고 생각하지 않았다.
살펴보십시오 NetDevice 남자 페이지. siocgifconf에 전화하여 모든 인터페이스와 주소의 목록을 얻으십시오.
주식에 감사드립니다!
배쉬 솔루션의 경우, 이것은 내가 끝나게 된 것입니다.
#!/bin/bash
/sbin/ifconfig|fgrep 'inet addr:'|fgrep -v '127'|cut -d: -f2|awk '{print $1}'|head -n1
헤드는 다중 고향 및/또는 논리적 인터페이스도 헤드없이 반환되므로 기본 IP가 반환되도록합니다.
따라서 스크립트가 /sbin /get_primary_ip에있는 경우 다음과 같은 작업을 수행 할 수 있습니다.
foo=$(get_primary_ip)
ifconfig는 감가 상각되고 오래되었습니다. iproute2는 새 스택이며 IP 명령을 사용합니다.
IP Addr, 그리고 거기에서 구문 분석.