Russian Qt Forum
Май 20, 2024, 10:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt Linux. Работа с libpcap  (Прочитано 6796 раз)
Andrew Vladoff
Гость
« : Январь 13, 2010, 13:06 »

Два вопроса.
1.Не правильно определяет IP адрес.
Вот код:
Код:
void CFmOptions::GetAdaptersInfo()// Информация об адаптерах
{
  struct TAdapter{
          QString Name;
          QString Desc;
          QString Ip;
          QString NetMask;
  };
  TAdapter AdapterInfo[10];

  char errbuf[PCAP_ERRBUF_SIZE];
  pcap_t *handle;
  int iAdaptersCount = 0;
 
  pcap_if_t *alldevs;
  pcap_if_t *d;
  char s[15];

if (pcap_findalldevs(&alldevs, errbuf) == -1)
return;

for (d=alldevs; d; d=d->next)
{
if (d->addresses == NULL)
continue;
AdapterInfo[iAdaptersCount].Name = d->name;
if (d->description)
AdapterInfo[iAdaptersCount].Desc = d->description;

AdapterInfo[iAdaptersCount].Ip = "0.0.0.0";
AdapterInfo[iAdaptersCount].NetMask = "0.0.0.0";
if (d->addresses != NULL)
{
sprintf(s,"%d.%d.%d.%d",
(UCHAR)d->addresses->addr->sa_data[2],
(UCHAR)d->addresses->addr->sa_data[3],
(UCHAR)d->addresses->addr->sa_data[4],
(UCHAR)d->addresses->addr->sa_data[5]);
AdapterInfo[iAdaptersCount].Ip = s;      // IP адрес карты
}

iAdaptersCount++;
}

pcap_freealldevs(alldevs);
}

У меня 2 сетевые карты. Определяет в принципе правильно  - eth0, eth1. Но с IP адресами проблема. У первой карточки пишет 1.0.0.0, у второй 2.0.0.0.
В чем тут может быть дело?


2.В WinPCap под Windows есть библиотека Packet.dll. Она позволяет считать количество пропущенных сетевой картой пакетов (функция PacketGetStats).
Есть ли что-то подобное в билиотеке Libpcap?
Записан
BlackTass
Гость
« Ответ #1 : Январь 13, 2010, 17:45 »

вопрос, а откуда вы взяли
Цитировать
(UCHAR)d->addresses->addr->sa_data[2],
(UCHAR)d->addresses->addr->sa_data[3],
(UCHAR)d->addresses->addr->sa_data[4],
(UCHAR)d->addresses->addr->sa_data[5]
во-первых советую бежать по адресам пока не встретите нулл (строго говоря addresses это массив и там может быть больше одного элемента).
во-вторых, преобразуйте sockaddr к sockaddr_in и используйте sin_addr оттуда. Это ип, записанный в лонг. Чтобы получить сам ип используйте inet_ntoa()
Записан
Andrew Vladoff
Гость
« Ответ #2 : Январь 13, 2010, 22:18 »

Этот код у меня в Винде работает!
А какой библиотеной подключать функции inet_ntoa(), htons() и т.п. А то компилятор на них ругается!
Записан
BlackTass
Гость
« Ответ #3 : Январь 13, 2010, 22:40 »

ну дак то было в винде.
для обоих методов подключать #include <arpa/inet.h>
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #4 : Январь 19, 2010, 16:40 »

В Линукс описания сетевых протоколов приведены в

#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/icmp.h>

А где все это искать в Винде?
Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #5 : Январь 20, 2010, 12:05 »

Странно, неужели никто ЭТОГО НЕ ЗНАЕТ?
Записан

Как мало времени и как много нужно узнать
niXman
Гость
« Ответ #6 : Январь 20, 2010, 12:17 »

Цитировать
неужели никто ЭТОГО НЕ ЗНАЕТ?
чего "этого" ?!
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #7 : Январь 20, 2010, 12:41 »

Цитировать
неужели никто ЭТОГО НЕ ЗНАЕТ?
чего "этого" ?!
В каких *.h файлах под Видой описаны сетевые протоколы TCP и UDР ?
Записан

Как мало времени и как много нужно узнать
niXman
Гость
« Ответ #8 : Январь 20, 2010, 12:53 »

ааа... ну хз. я венду не юзаю.
там что-то типа winsock есть. погугли.
Записан
p166
Гость
« Ответ #9 : Февраль 09, 2010, 15:24 »

.h файл

#ifdef Q_WS_WIN
  #include <winsock2.h>
#endif

файл проекта

win32:LIBS += libws2_32

и будет все работать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 19.