Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ARP запрос через socket, учитывая routing table 
V
    Опции темы
slavayo7777
Дата 23.6.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прогер



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.6.2011

Репутация: нет
Всего: нет



Цитата(fish9370 @ 23.6.2011,  11:04)
я думал, ты это понял..
вот еще интерфейс для получения arp-таблицы
/proc/net/arp

Спасибо. Пойду писать парсеры для этих файлов. Думаю, вопрос можно пометить решенным.
Хотя конечно вдруг кто вспомнит функцию или вызов, которые исходя из таблицы возвращают айпишник, буду очень рад.
Ну или может, кто то уже делал такой парсер и выложит код...  smile 
Всем большое спасибо!!
PM MAIL ICQ   Вверх
slavayo7777
Дата 23.6.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прогер



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.6.2011

Репутация: нет
Всего: нет



Вот сделал парсер, который возвращает адресс гейтвея, если он прописан (если кому надо). Взял за основу net-tools
Код

#define _PATH_PROCNET_ROUTE "/proc/net/route"
#define RTF_UP          0x0001          /* route usable                 */
#define RTF_GATEWAY     0x0002          /* destination is a gateway     */
#define SWAP32(x)  ( ((x & 0xff000000) >> 24) \
                   | ((x & 0x00ff0000) >>  8) \
                   | ((x & 0x0000ff00) <<  8) \
                   | ((x & 0x000000ff) << 24) )
/*input ipaddr in ulong format e.g 192.168.1.1 will be C0A80101
   output in the same format ip addr checked in route table
   return 0 if error
*/
unsigned long Check_route_table(unsigned long dest_ip_address)
{
    char buff[1024], iface[16];
    char gate_addr[128], net_addr[128];
    char mask_addr[128];
    unsigned long mask, net, gate;
    int num, iflags, metric, refcnt, use, mss, window, irtt;
    FILE *fp = fopen(_PATH_PROCNET_ROUTE, "r");
    char *fmt;

    if (!fp)
    {
        perror(_PATH_PROCNET_ROUTE);
        printf("INET (IPv4) not configured in this system.\n");
        return 0;
    }

    fmt = proc_gen_fmt(_PATH_PROCNET_ROUTE, 0, fp, "Iface", "%16s",
            "Destination", "%128s", "Gateway", "%128s", "Flags", "%X",
            "RefCnt", "%d", "Use", "%d", "Metric", "%d", "Mask", "%128s",
            "MTU", "%d", "Window", "%d", "IRTT", "%d", NULL);
    if (!fmt)
        return 0;

    while (fgets(buff, 1023, fp))
    {
        num = sscanf(buff, fmt, iface, net_addr, gate_addr, &iflags, &refcnt,
                &use, &metric, mask_addr, &mss, &window, &irtt);
        if (num < 10 || !(iflags & RTF_UP))
            continue;
        net = strtoul(net_addr, NULL, 16);
        gate = strtoul(gate_addr, NULL, 16);
        mask = strtoul(mask_addr, NULL, 16);
        /* Decode the flags. */
        if ((iflags & RTF_UP)&&(iflags&RTF_GATEWAY))
        {
            dest_ip_address = SWAP32(dest_ip_address);
            if((dest_ip_address&mask) == net)
                return SWAP32(gate);
        }
        /* Print the info. */
    }
    free(fmt);
    (void) fclose(fp);
    return dest_ip_address;
}

char *proc_gen_fmt(char *name, int more, FILE * fh,...)
{
    char buf[512], format[512] = "";
    char *title, *head, *hdr;
    va_list ap;

    if (!fgets(buf, (sizeof buf) - 1, fh))
    return NULL;
    strcat(buf, " ");

    va_start(ap, fh);
    title = va_arg(ap, char *);
    for (hdr = buf; hdr;) {
    while (isspace(*hdr) || *hdr == '|')
        hdr++;
    head = hdr;
    hdr = strpbrk(hdr, "| \t\n");
    if (hdr)
        *hdr++ = 0;

    if (!strcmp(title, head)) {
        strcat(format, va_arg(ap, char *));
        title = va_arg(ap, char *);
        if (!title || !head)
        break;
    } else {
        strcat(format, "%*s");    /* XXX */
    }
    strcat(format, " ");
    }
    va_end(ap);

    if (!more && title) {
    fprintf(stderr, "warning: %s does not contain required field %s\n",
        name, title);
    return NULL;
    }
    return strdup(format);
}

PM MAIL ICQ   Вверх
fish9370
Дата 23.6.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



неплохой код.. спасибо..
мне аж захотелось поделиться с тобой своим парсером..



--------------------
undefined
PM MAIL WWW ICQ   Вверх
slavayo7777
Дата 24.6.2011, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прогер



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.6.2011

Репутация: нет
Всего: нет



Цитата(fish9370 @ 23.6.2011,  21:16)
неплохой код.. спасибо..
мне аж захотелось поделиться с тобой своим парсером..

ну так делись  smile 
PM MAIL ICQ   Вверх
fish9370
Дата 24.6.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Код

/*
 *
 * \section copyright Copyright and author
 *
 * Copyright (C) 2008 - 2011, fish9370.
 *
 * \author Oleg Shteinliht <[email protected]>
 *
 */

/*! \file
  \brief source file for Mifi  - the Open Source test program.

 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> /* for bool type */
#include <getopt.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#include "logger.h"
#include "gateway.h"

#define MAX_WORDS 256

int errcode = 0;

int next_word(char *str) {
        char *pos = str;
        if(pos)
                while(*pos && ((unsigned char) *pos) < 33)
                        pos++;

        return pos - str;
}

int next_space(char *str) {
        char *pos = str;
        if(pos)
                while(*pos && ((unsigned char) *pos) > 32)
                        pos++;

        return pos - str;
}

int split_words(char *buff, char *ap[], int size) {
        if (!buff)
                return 0;
        int len = strlen(buff), n = 0;

        char *pos = buff;
        for (pos = buff + next_word(pos); pos < buff + len; n++) {
                if (n == size - 1)
                        break;
                ap[n] = pos;
                pos += next_space(pos);
                *pos++ = '\0';
                pos += next_word(pos);
        }

        ap[n] = NULL;

        return n;
}

void parse_route(char *default_gw)
{
        char buff[LINE_MAX];
        char *buffv[MAX_WORDS];
        FILE *f;

        if (!(f = fopen("/proc/net/route", "r"))) {
                mifi_verbose(LOG_VERBOSE, "open file error: %s\n", strerror(errno));
                return;
        }

        while (fgets(buff, sizeof(buff), f)) {
                if (split_words(buff, buffv, MAX_WORDS) != 11)
                        continue;

                if (!strcmp("00000000", buffv[1]) && !strcmp("00000000", buffv[7]))
                        strcpy(default_gw, buffv[2]);
        }

        fclose(f);
}

void usage(const char * const name)
{
        mifi_verbose(LOG_VERBOSE, "usage:\n%s [options]\n", name);
        mifi_verbose(LOG_VERBOSE, "options:\n");
        mifi_verbose(LOG_VERBOSE, "  --help\t\t\tThis help.\n");
        mifi_verbose(LOG_VERBOSE, "  -d, --debug\t\t\tPrint lots of debugging information.\n");
        mifi_verbose(LOG_VERBOSE, "  -V, --version \t\tPrint program version.\n");

        mifi_verbose(LOG_VERBOSE, "\nreport bugs to <[email protected]>\n");
}

int main(int argc, char *argv[])
{

        static struct option long_options[] = {
                {"help", 0, 0, '?'},
                {"debug", 0, 0, 'd'},
                {"version", 0, 0, 'V'},
                {0, 0, 0, 0}
        };

        int c, index = 0;
        while((c = getopt_long(argc, argv, "hdV", long_options, &index)) != -1) {
                switch(c) {
                case 'd':
                        flags.debug = true;
                        break;

                case ':':
                        mifi_verbose(LOG_VERBOSE, "Option -%c requires an operand\n", optopt);
                        usage(argv[0]);
                        errcode = -1;
                        goto exit;

                case 'V':
                        mifi_verbose(LOG_VERBOSE, "%s %s\n", PROGNAME, PROGVERSION);
                        mifi_verbose(LOG_VERBOSE, "Copyright (C) 2010 ");
                        mifi_verbose(LOG_NORMAL_BOLD, "fish9370\n");
                        mifi_verbose(LOG_VERBOSE, "This is free software; see the source for copying conditions.  There is NO\n");
                        mifi_verbose(LOG_VERBOSE, "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
                        goto exit;

                case '?':
                        /*printf("Unrecognized option: -%c\n", optopt);*/
                        usage(argv[0]);
                        goto exit;
                }
        }

        char default_gw[LINE_MAX];
        parse_route(default_gw);

        mifi_verbose(LOG_VERBOSE, "default gw: %s\n", default_gw);

exit:
        return errcode;
}



здесь не все декларации, если есть вопросы - добро пожаловать в мою учебную помойку http://79.120.100.108/mifi/
файл называется test/gateway.c



--------------------
undefined
PM MAIL WWW ICQ   Вверх
slavayo7777
Дата 27.6.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прогер



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 22.6.2011

Репутация: нет
Всего: нет



Цитата(slavayo7777 @ 23.6.2011,  15:00)
Вот сделал парсер, который возвращает адресс гейтвея, если он прописан (если кому надо). Взял за основу net-tools

хреновый однако парсер я сделал)) ошибочка вышла небольшая, но эт не страшно. с несколькими маршрутами гейтвеев  мой парсер отказался работать, исправил:
Код

unsigned long Check_route_table(unsigned long dest_ip_address)
{
    char buff[1024], iface[16];
    char gate_addr[128], net_addr[128];
    char mask_addr[128];
    unsigned long mask, net, gate;
    unsigned long dest_ip_swaped = SWAP32(dest_ip_address);
    int num, iflags, metric, refcnt, use, mss, window, irtt;
    FILE *fp = fopen(_PATH_PROCNET_ROUTE, "r");
    char *fmt;

    if (!fp)
    {
        perror(_PATH_PROCNET_ROUTE);
        printf("INET (IPv4) not configured in this system.\n");
        return 0;
    }

    fmt = proc_gen_fmt(_PATH_PROCNET_ROUTE, 0, fp, "Iface", "%16s",
            "Destination", "%128s", "Gateway", "%128s", "Flags", "%X",
            "RefCnt", "%d", "Use", "%d", "Metric", "%d", "Mask", "%128s",
            "MTU", "%d", "Window", "%d", "IRTT", "%d", NULL);
    if (!fmt)
        return 0;

    while (fgets(buff, 1023, fp))
    {
        num = sscanf(buff, fmt, iface, net_addr, gate_addr, &iflags, &refcnt,
                &use, &metric, mask_addr, &mss, &window, &irtt);
        if (num < 10 || !(iflags & RTF_UP))
            continue;
        net = strtoul(net_addr, NULL, 16);
        gate = strtoul(gate_addr, NULL, 16);
        mask = strtoul(mask_addr, NULL, 16);
        /* Decode the flags. */
        if ((iflags & RTF_UP)&&(iflags&RTF_GATEWAY))
        {
            if((dest_ip_swaped & mask) == net)
                return SWAP32(gate);
        }
        /* Print the info. */
    }
    free(fmt);
    (void) fclose(fp);
    return dest_ip_address;
}


Цитата

здесь не все декларации, если есть вопросы - добро пожаловать в мою учебную помойку

у меня были бурные выходные, потому только начинаю работать) 
спасибо за приглашение... может я еще чего то найду интересного.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.