Всем привет! Подскажите пожалуйста как программно (из С) получить ip-адрес для определённого интерфейса. Форканье, запуск ifconfig и парсинг результата не предлагать :)
> Что ж тогда предложим гугл и поиск по сайту opennet.ru
Ну да - поискал уже кое-чего, вот что родил:
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
char name[256];
struct hostent * hst = NULL;
int i;
gethostname (name, 256);
hst = gethostbyname (name);
herror("gethostbyname");
printf("%s\n",name);
if(hst){
printf("hname = %s\n",hst->h_name);
printf("h_addrtype = %d\n",hst->h_addrtype);
printf("h_length = %d\n",hst->h_length);
for(i=0; hst->h_addr_list[i]; i++){
printf("Ip address %d is: %d.%d.%d.%d\n",
i+1,
(unsigned char)(hst->h_addr_list[i][0]),
(unsigned char)(hst->h_addr_list[i][1]),
(unsigned char)(hst->h_addr_list[i][2]),
(unsigned char)(hst->h_addr_list[i][3]));
}
}
return 0;
};
Только вот на x86 всё пускается замечательно, а на mipsel определяется hostname, но gethostbyname возвращает NULL.
Бля... форматирование достало
Сдесь http://www.opennet.ru/docs/BSD/qa/err-resolving.html говорится о том, что надо настроить работу DNS. Но на том рутере, на котором будет работать программа DNS не предполагается, хотя может быть несколько интерфейсов (eth0 - eth3), которым статически выдаются ip. Может кто-нибудь знает как мне получить эти ip без ненужного мне DNS ?
Спасибо - попробую... только вопрос - а нафмга там сокет открывается? :)
Или это просто кусок кода, а всё, что мне нужно это
if (inet_aton(iface, &inp)) {
strcpy(ip, inet_ntoa(inp));
return SY_OK;
}
мозг тебе нужен рабочий. попробуй своим деревянным черепом настучать вопрос гуглю по поводу SIOCGIFADDR. всё-таки я зря код привёл. одно немного радует — скопипастить его не выйдет, придётся таки буковки некоторые поменять.
а вообще — лучше тебе вообще никаких программ не писать. иди в манагеры, там мозг противопоказан и читать до конца категорически воспрещается. как раз без труда по конкурсу пройдёшь.
Лучше всего найди исходники net-tools, находишь там ifconfig.c и в нем
/* Do we have to show the current setup? */
if (argc == 0) {
int err = if_print((char *) NULL);
(void) close(skfd);
Далее открывешь lib/interface.c и там ищешь эту if_print и узнаешь все в подробностях как запросить конфигурацию у ядра и тд и тп.