С send(new_socket, &contours[i], size, 0)
вы отправляете фактический std::vector
объект в contours[i]
, вы не отправляете его данные. И std::vector
объект - фактически просто обертка вокруг указателя и размера. И вы не можете отправлять указатели по сети.
Вам необходимо отправить фактические данные каждого вектора:
for (auto const& sub_vector : contours)
{
// First send the number of elements
uint32_t number_elements = sub_vector.size();
send(new_socket, &number_elements, sizeof number_elements, 0);
// Then send the actual data
send(new_socket, sub_vector.data(), sub_vector.size() * sizeof sub_vector[0], 0);
}
[Проверка ошибок опущена, но она действительно должна быть.]
Я также рекомендую не использовать тип, подобный int
, так как его размер на самом деле не фиксирован. Если вы хотите 32-разрядные целые числа без знака, используйте uint32_t
. Конечно, вы можете использовать int
внутри вашей программы и конвертировать данные в переносимый тип фиксированного размера для передачи, если принимающая сторона может выполнить обратное преобразование.
Кроме того, я рекомендую вам также отправить количество субвекторов, которые вы хотите отправить, чтобы получающая сторона знала это заранее:
uint32_t number_vectors = contours.size();
send(new_socket, &number_vectors, sizeof number_vectors, 0);
for (...) { ... }
На принимающей стороне вы можете сделать что-то вроде
// Receive the number of sub-vectors
uint32_t number_vectors;
recv(sock, &number_vectors, sizeof number_vectors, 0);
// Create the vectors
std::vector<std::vector<int>> contours(num_vectors);
// Read all sub-vectors
for (auto& sub_vector : contours)
{
// Receive the amount of values
uint32_t number_elements;
recv(sock, &number_elements, sizeof number_elements, 0);
// Create the sub-vector
sub_vector = std::vector<int>(number_elements);
// Receive the sub-vector data
recv(sock, sub_vector.data(), sub_vector.size() * sizeof sub_vector[0], 0);
}
[Примечание: Опять проверка ошибок опущена, но она действительно должна быть там.]