2015-09-01 3 views
0

Я пытаюсь сделать самодельную систему для обмена пакетами, особенно на уровне 2 без чего-либо выше, на CentOS ...пространство имен libcrafter Конфликт/Pcap ++

Я использую

  • libcrafter для создания пакетов
  • pcap++ нюхать пакеты
  • (crypto++ обеспечить минимальную безопасность - не по теме этого вопроса)

Дело в том, что моя программа получает и отправляет пакеты (и, таким образом, использует PCAP ++ и libcrafter), существует конфликт с классом Packet, определенным как в libcrafter и в Pcap++ ...

Вот мой заголовок:

#include <stdio.h> 
#include <iostream> 
#include <getopt.h> 
#include <stdlib.h> 
#include <fstream> 
#include <memory> 
#include <pthread.h> 
#include <errno.h> 
#include <vector> 
#include <string> 
#include <sstream> 
/**** LIBCRAFTER ******/ 
#include <MacAddress.h> 
#include <IpAddress.h> 
#include <PlatformSpecificUtils.h> 
#include <PcapLiveDeviceList.h> 
#include <PcapLiveDevice.h> 
#include <EthLayer.h> 
#include <PayloadLayer.h> 
#include <Logger.h> 
#include <in.h> 
#include <PointerVector.h> 
#include <crafter.h> 
using namespace Crafter; 
using namespace std; 

а вот первая ошибка я получаю:

server_resp.cpp: In function ‘int main(int, char**)’: 
server_resp.cpp:74:3: error: reference to ‘Packet’ is ambiguous 
    Packet pack_decod(capturedPackets.getAndRemoveFromVector(position)); 
^
In file included from /home/myself/Downloads/PcapPlusPlus-master/Dist/header/PcapLiveDevice.h:9:0, 
       from /home/myself/Downloads/PcapPlusPlus-master/Dist/header/PcapLiveDeviceList.h:5, 
       from server_resp.cpp:16: 
/home/myself/Downloads/PcapPlusPlus-master/Dist/header/Packet.h:19:7: note: candidates are: class Packet 
class Packet { 
    ^
In file included from /usr/local/include/crafter/Crafter.h:104:0, 
       from /usr/local/include/crafter.h:33, 
       from server_resp.cpp:23: 
/usr/local/include/crafter/Packet.h:44:8: note:     class Crafter::Packet 
    class Packet { 
     ^

Я могу предоставить MME, но это довольно длинный (150 строк), и я хотел держать вопрос просто ...

Edit: У меня также есть проблемы с классом Ethernet

ответ

1

С конфликтов имен, таких, как этот есть только две вещи, которые вы можете практически сделать:

  1. Измените исходный код и оберните библиотеку в ее собственное пространство имен. Таким образом вы можете сделать что-то вроде Crafter :: Packet.

    - Или -

  2. можно переименовать один из двух пакетов в чем-то уникальным. Это также означает изменение всех ссылок на новое имя пакета в самой библиотеке.

Я частично отношусь к обертке библиотеки в своем собственном пространстве имен. Как это наименьшее усилие.

Наконец, я предлагаю сделать патч этого и отправить его авторам библиотек. Вероятно, это произойдет не в первый раз, и это не будет последним.

+0

Просто чтобы быть ясно, вы предлагаете создать пространство имен для '' PCAP ++, так как он не имеет его собственное пространство имен? – EisenHeim

+1

Я ближе познакомился с источником библиотек и заметил, что Crafter уже находится в пространстве имен, тогда как pcap ++ - нет. Затем я заметил определенную строку в вашем коде: «using namespace Crafter;». В основном вам не нужно ничего делать, кроме как удалить эту строку, и просто указать, какой тип пакета вы хотите использовать в соответствии с моим ответом. В основном вам нужны некоторые средства, чтобы отличить два пакета. У Crafter уже есть дополнительная оболочка пространства имен, поэтому я буду использовать ее. Кроме того, не используйте 'namespace std;'.Это вызовет те же проблемы, что и у вас, с обычно названными функциями (такими как min и max). – Nathilion

+0

OK, для crafter это, таким образом, Crafter :: Packet, а остальное он будет автоматически искать в pcap ++? Я не использую пространство имен:/ – EisenHeim

2

Пожалуйста, обратите внимание, что теперь PcapPlusPlus имеет свое собственное пространство имен (pcpp), чтобы эти конфликты не должны происходить больше

Смежные вопросы