同 send(new_socket, &contours[i], size, 0) 你送实际的 std::vector 对象 contours[i] ,你不发送它的数据。还有一个 std::vector 对象实际上只是指针和大小的包装器。而你不能通过网络发送指针。
send(new_socket, &contours[i], size, 0)
std::vector
contours[i]
你需要发送实际的 数据 每个载体:
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 在程序内部,并将数据转换为便携式固定大小类型进行传输,只要接收方可以进行相反的转换。
int
uint32_t
此外,我建议您还发送要发送的子矢量的数量,以便接收方事先知道它:
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); }
<子> [注意:再次忽略错误检查,但应该真的存在。] 子>