我在c / c + +中使用libpcap,在向量中插入指针时遇到问题。 这是我的代码:
typedef vector <u_char *>vPack;
...
vPack vect;
...
if (pcap_dispatch (p, 0, &mycallback, (u_char *) &vect) < 0){
cout << "Error" << endl;
pcap_perror (p, prestr);
}
....
void mycallback (u_char * args, const struct pcap_pkthdr *pkthdr, const u_char * packet){
u_char *pk;
pk = (u_char *)packet;
vPack *vec = (vPack *) args;
vec[0].push_back(pk);
}
问题是元素被插入到相同的内存位置,并且向量总是包含相同的元素。 有什么建议吗?
PD:对不起我的英语。答案 0 :(得分:2)
在mycallback
中,参数packet
是const u_char
- 缓冲区。该指针指向一个libpcap内部数据缓冲区,该缓冲区重用于与您的过滤器匹配的每个数据包(并调用您的回调)。您必须创建自己的缓冲区并将数据包数据复制到其中。
例如:
u_char *b = malloc(pkthdr->caplen);
memcpy(b, pk, pkthdr->caplen);
vec[0].push_back(b);
答案 1 :(得分:1)
您必须将数据复制到新分配的内存中:
void mycallback (u_char * args, const struct pcap_pkthdr *pkthdr, const u_char * packet)
{
u_char *pk = new u_char [pkthdr->caplen];
memcpy(pk, packet, pkthdr->caplen);
vPack *vec = (vPack *) args;
vec->push_back(pk);
}
但是需要考虑一些重要问题:
vector
时,您必须遍历每个元素并明确地delete
,以便恢复记忆。vector
范围内。你真的需要一个存储数据及其长度的类,然后存储vector
这些对象。答案 2 :(得分:0)
typedef std::vector <u_char*> VPack;
void handler(u_char *user, const pcap_pkthdr *h, const u_char *bytes)
{
VPack & v = *reinterpret_cast<VPack*>(user);
v.insert(v.end(), bytes, bytes + h->caplen);
}
int main()
{
VPack v;
// ... populate p ...
int result = pcap_dispatch(p, 0, handler, reinterpret_cast<uchar*>(&v));
}
这里唯一值得注意的是我们通过v
参数传递指向user
的指针,因此我们必须在两端进行一些类型不安全的转换。不过,这只是使用C回调函数的标志。
答案 3 :(得分:0)
延长了卡瑞克的尝试!
struct packet_handler
{
typedef std::vector<u_char> PacketType;
typedef std::vector <PacketType> PacketBuffer;
static void handler(u_char *user, const pcap_pkthdr *h, const u_char *bytes)
{
packet_handler* ph = reinterpret_cast<packet_handler*>(user);
ph->handle(PacketType(bytes, bytes + h->caplen));
}
void handle(PacketType const& packet)
{
_packetBuffer.push_back(packet);
}
PacketBuffer _packetBuffer;
};
int main()
{
packet_handler ph;
// pass in the handler class as user data
int result = pcap_dispatch(p, 0, packet_handler::handler, reinterpret_cast<uchar*>(&ph));
}