LINUX.ORG.RU

Ответ на: комментарий от php-coder

> Что ж тогда предложим гугл и поиск по сайту 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.
Бля... форматирование достало

anonymous
()
Ответ на: комментарий от anonymous

Сдесь http://www.opennet.ru/docs/BSD/qa/err-resolving.html говорится о том, что надо настроить работу DNS. Но на том рутере, на котором будет работать программа DNS не предполагается, хотя может быть несколько интерфейсов (eth0 - eth3), которым статически выдаются ip. Может кто-нибудь знает как мне получить эти ip без ненужного мне DNS ?

anonymous
()

syren_tpc.c:
TSyResult SyGetIFIP (char *ip, const char *iface) {
  int res, fd;
  struct ifreq ifr;
  struct in_addr inp;
  if (!ip) return SY_ERROR;
  *ip = '\0';
  if (!iface || !(*iface)) return SY_ERROR;

  if (inet_aton(iface, &inp)) {
    strcpy(ip, inet_ntoa(inp));
    return SY_OK;
  }

  if (strlen(iface) > IFNAMSIZ) return SY_ERROR;
  fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
  memset(&ifr, 0, sizeof(struct ifreq));
  strcpy(ifr.ifr_name, iface);
  ifr.ifr_addr.sa_family = AF_INET;
  res = ioctl(fd, SIOCGIFADDR, &ifr);
  SySocketClose(fd);
  if (!res) {
    struct sockaddr_in *x = (struct sockaddr_in *)&ifr.ifr_addr;
    strcpy(ip, inet_ntoa(x->sin_addr));
    return SY_OK;
  }
  return SY_ERROR;
}


ip: куда положить IP
iface: eth0, ppp0, etcxyz

anonymous
()

ну, и всяких инклюдов по вкусу (лишнее вычеркнуть):
#include <sys/types.h>
#include <sys/socket.h>

/* inet_aton(), etc */
#include <netinet/in.h>
#include <arpa/inet.h>

/* gethostbyname() */
#include <netdb.h>


/* SyGetIFIP() support */
/* ioctl() %-) */
#include <sys/ioctl.h>

/* IFNAMSIZ, struct ifreq */
#include <net/if.h>

anonymous
()
Ответ на: комментарий от anonymous

Спасибо - попробую... только вопрос - а нафмга там сокет открывается? :)
Или это просто кусок кода, а всё, что мне нужно это 
  if (inet_aton(iface, &inp)) {
    strcpy(ip, inet_ntoa(inp));
    return SY_OK;
  }

anonymous
()
Ответ на: комментарий от anonymous

мозг тебе нужен рабочий. попробуй своим деревянным черепом настучать вопрос гуглю по поводу SIOCGIFADDR. всё-таки я зря код привёл. одно немного радует — скопипастить его не выйдет, придётся таки буковки некоторые поменять.

а вообще — лучше тебе вообще никаких программ не писать. иди в манагеры, там мозг противопоказан и читать до конца категорически воспрещается. как раз без труда по конкурсу пройдёшь.

anonymous
()
Ответ на: комментарий от anonymous

мда… смена, #$#$^^&, выросла. не то, что написать — прочитать готовое не может. где бы взять другой глобус…

anonymous
()

#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
...
struct ifaddrs* ifa, *ifptr;
getifaddrs(&ifa);
ifptr = ifa;
while (ifptr->ifa_next) {
        struct sockaddr_in* in = (struct sockaddr_in*)ifptr->ifa_addr;
        if (in->sin_family == AF_INET && strcmp(ifptr->ifa_name, "eth0") == 0)
                networkAddress = (char*)inet_ntoa(in->sin_addr);
        ifptr = ifptr->ifa_next;
}
freeifaddrs(ifa);

mv ★★★★★
()

Стивенс уже не в моде?

anonymous
()

Лучше всего найди исходники 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 и узнаешь все в подробностях как запросить конфигурацию у ядра и тд и тп.

koTuk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.