Я использую RAW сокет для захвата пакетов UDP. После захвата хочу разобрать пакет и посмотреть что внутри.
Входные данные, которые я получаю из сокета, представляют собой беззнаковый буфер char * и его длину. Я пытался поместить буфер в строку, но, думаю, я сделал это неправильно, потому что, когда я проверял строку, она была пустой.
Любой совет?
Я не знаю, что вы хотите проанализировать, но у вас есть буфер и его длина. Таким образом, вы можете делать все, что вы хотите с этой памятью. Ищите арифметику указателей. Если вы хотите создать C-строку из содержимого, просто добавьте ‘\ 0’ в конец блока памяти. Но это предполагает, что никакие другие 0x00 не находятся внутри буфера. Так что, возможно, вы должны это проверить. Как сказал πάντα ῥεῖ.
шаги:
1: получить пакет UDP
2: бросить как:
unsigned char* buffer;
char* cString = (char*) buffer;
3: проверить приведенную cString, если ‘\ 0’ произошло до того, как был достигнут размер буфера. Если это так, то создайте новый указатель 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.
Надеюсь, вы искали что-то подобное, потому что ваш вопрос был неясным.