Эта строка неверна:
int n = recvfrom(fd_, ret, buffSize, &recvAddress, &sockSize);
Должно быть:
int n = recvfrom(fd_, &(*ret)[0], buffSize, 0, &recvAddress, &sockSize);
Вы читаете данные непосредственно в структуру данных std::vector
, которая обычно состоит из 3 указателей (начало, конец и конец хранилища). Итак, вы перезаписываете эти 3 указателя данными, полученными через сокет, а затем перезаписываете случайную память после вектора. Компилятор не жалуется, потому что любой тип указателя (в данном случае std::vector<char> *
) неявно преобразуется в void*
(второй параметр в recvfrom
).
Вы, конечно, хотите прочитать данные в буфер, на который указывает вектор, который получается путем взятия адреса его первого элемента, а именно &(*ret)[0]
. Мы должны добавить неудобные скобки, потому что скобки []
имеют более высокий приоритет оператора, чем унарный оператор разыменования *
.
(Также обратите внимание, что вы пропускаете параметр flags
для recvfrom()
- я предполагаю, что это была просто ошибка транскрипции при написании этого вопроса, и сейчас я установил здесь значение 0
. ) * * тысяча двадцать-один