mam*_*don 1 c++ packets memcpy new-operator
好吧,我正在直接从数据包中取出数据包并从中提取TCP流.
简而言之,这意味着剥离各种标题(例如,eth-> IP-> TCP->流数据).
在我最终通过所有标题时调用的函数中,我遇到了一个奇怪的错误.
/*Meta is a pointer to the IP header, pkt is a pointer to the TCP header*/
virtual const u_char* processPacket(const u_char* pkt, const u_char* meta) {
//Extract IP info from meta.
iphdr* metaHdr = (iphdr*)meta;
//Form TCP header from the current offset, hdr.
const tcphdr* hdr = (const tcphdr*)pkt;
//Do pointer math to figure out the size of the stream data.
u_int32_t len = ntohs(metaHdr->tot_len) - metaHdr->ihl*4 - hdr->doff*4;
if(len > 0)
{
//Store TCP stream data in a queue, mapped to it's IP source.
TCPStream* stream = new TCPStream();
stream->seqNumber = ntohl(hdr->seq);
stream->streamData = new u_char(len);
//memcpy(stream->streamData, offset(pkt), len);
for(u_int32_t i = 0; i < len; i++)
{
printf("k%i-%i",len, i); //Used to figure out when the segfault occurs.
stream->streamData[i] = offset(pkt)[i]; //Offset returns a pointer to the data under the TCP header
}
//streams[metaHdr->saddr].push(stream);
}
return offset(pkt);
};
Run Code Online (Sandbox Code Playgroud)
TCP流只是一个u_int32_t并u_char*指向数据包数据的副本.所以,当我使用memcpy时,它就是segfaulted.
显然,要么我的指针无效,要么我弄乱了我的长度.
在这个特定的数据包的情况下,数据的长度是1380字节(由Wireshark确认),因此正确计算len.
好吧,所以我必须弄乱我的指针(但不是NULL).我做了以下实验:
stream->streamData[0] = offset(pkt)[0]; //Works
stream->streamData[0] = offset(pkt)[len]; //Works, odd.
stream->streamData[len] = offset(pkt)[0]; //Fails, scary
stream->streamData[len] = offset(pkt)[len]; //Fails
Run Code Online (Sandbox Code Playgroud)
所以,我在解除对streamData(索引1236具体)的过度引用时会出现段错误!但streamData实例化为:
stream->streamData = new u_char(len);
Run Code Online (Sandbox Code Playgroud)
我开始在i = 0处迭代streamData,所以我不会跳过一堆我的数据.streamData是u_char*和offset(pkt)是u_char*所以我不搞乱了我的类型.
在成功迭代3000多个其他数据包之后,这在特定数据包中失败.转储文件是27兆,我有4个ram的演出,所以我不认为我已经用完了或任何东西......所以我不得不断定新的没有分配足够的内存,但为什么?
Unc*_*ens 11
stream->streamData = new u_char(len);
Run Code Online (Sandbox Code Playgroud)
这将分配一个单独的字符,初始化为len.
要分配数组,请使用:
stream->streamData = new u_char[len];
Run Code Online (Sandbox Code Playgroud)
而你在哪里解除它:
delete [] stream->streamData;
Run Code Online (Sandbox Code Playgroud)
编辑:
stream->streamData[len] = offset(pkt)[0]; //Fails, scary
Run Code Online (Sandbox Code Playgroud)
即使正确分配了数组,这也是未定义的行为.要访问的有效索引是0到len 不包括在内.
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |