如何在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_cast(buffer), buff_len); 我最近有一个类似的案例,决定使用std::array<uint8_t,PACKET_LENGTH>来存储原始数据包数据。但是我有来自该协议的所有数据包,它们具有固定大小,这是预先知道的。另一个合适的类型是std::vector<uint8_t> 您能否举例说明如何使用 std::vector 从 unsigned char* 缓冲区中获取字符串? 当原始缓冲区长度为 0 时,您会得到一个空字符串。当您的空性检查不正确时,您会得到一个明显的空字符串。 【参考方案1】:

我不知道你想解析什么,但你有缓冲区和它的长度。所以你可以用这个内存做任何你想做的事情。寻找指针算术。如果您想从内容中创建一个 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中解析从套接字捕获的数据包?的主要内容,如果未能解决你的问题,请参考以下文章

将 CPP 定义移植到 python

在 C 中挂钩到 TCP 堆栈

python使用原始套接字 解析原始ip头数据

python使用原始套接字 解析原始ip头数据

如何从 Django Channels Web 套接字数据包中获取当前用户?

如何从蓝牙套接字捕获错误并打印自定义消息?