如何在cpp中解析从套接字捕获的数据包?
Posted
技术标签:
【中文标题】如何在cpp中解析从套接字捕获的数据包?【英文标题】:How to parse captured packet from socket in cpp? 【发布时间】:2015-05-03 08:32:08 【问题描述】:我正在使用 RAW 套接字来捕获 udp 数据包。捕获后我想解析数据包并查看里面的内容。
我从套接字获得的输入是一个 unsigned char* 缓冲区,它是长度。我试图将缓冲区放入一个字符串中,但我想我做错了,因为当我检查字符串时它是空的。
有什么建议吗?
【问题讨论】:
缓冲区可能包含'\0'
值,您是如何从缓冲区分配std::string
的? assign()
函数有一个版本,它需要明确的大小来传输。
环顾四周后,我尝试了:std::string s(reinterpret_caststd::array<uint8_t,PACKET_LENGTH>
来存储原始数据包数据。但是我有来自该协议的所有数据包,它们具有固定大小,这是预先知道的。另一个合适的类型是std::vector<uint8_t>
。
您能否举例说明如何使用 std::vector我不知道你想解析什么,但你有缓冲区和它的长度。所以你可以用这个内存做任何你想做的事情。寻找指针算术。如果您想从内容中创建一个 C-String,只需在内存块的末尾添加一个 '\0' 即可。但这假设缓冲区内没有其他 0x00。所以也许你必须检查一下。就像 πάντα ῥεῖ 所说。
步骤:
1:接收UDP包
2: 像:
unsigned char* buffer;
char* cString = (char*) buffer;
3:如果在达到缓冲区大小之前出现“\0”,则检查转换后的 cString。如果是这样,则创建一个新的 char* 指针,指向 '\0' 之后的字节,但要注意缓冲区大小。将指针保存在向量中。
我做了一个代码示例,但没有检查它是否可以运行!
char* firstPtr = (char*) buffer;
size_t indexer = 0;
std::vector<char*> pointerVec;
pointerVec.push_back(firstPtr);
while(indexer < bufferSize)
if(*(buffer + indexer) == '\0')
if(indexer + 1 < bufferSize)
char* cString = (char*) (buffer + indexer);
pointerVec.push_back(cString);
// end while
之后,您应该使用向量内的指针保存不同字符串的位置。现在您可以将它们处理为一种复制机制,该机制获取每个 C-String 指针并将其内容保存到一个 C-String 或 String。
希望您搜索类似的内容,因为您的问题不清楚。
【讨论】:
以上是关于如何在cpp中解析从套接字捕获的数据包?的主要内容,如果未能解决你的问题,请参考以下文章