【问题标题】:How to parse captured packet from socket in cpp?如何在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 时,您会得到一个空字符串。当您的空性检查不正确时,您会得到一个明显的空字符串。

标签: c++ string packet-capture unsigned-char


【解决方案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。

希望您搜索类似的内容,因为您的问题不清楚。

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多