Формулировка вашего вопроса говорит о том, что вы ищете следующее:
company foo;
send(sockfd, &foo, sizeof(foo), 0); // DO NOT do this
Это в основном выведет всю память структуры company
в ваш сокет.Это не будет работать в этом случае.И даже когда это работает, это действительно плохая идея.Причина, по которой это не сработает, заключается в том, что vector
не содержат данные напрямую.Они указывают на это.Это означает, что когда вы выгружаете структуру, содержащую векторы, в сокет, вы будете выгружать указатели в память, но не на материал, на который указываетЭто приведет к (в лучшем случае) сбоям на принимающей стороне.
Это будет работать для отдельных person
или car
объектов.Они не содержат указателей, и поэтому их память содержит все соответствующие значения '
На отправляющей стороне:
person joe = { "Joe", 35 };
send(sockfd, &joe, sizeof(joe), 0); // may work, but is a bad idea, see below
На принимающей стороне:
person joe;
recv(sockfd, &joe, sizeof(joe), 0);
НоЭто все еще плохая идея.Он полагается на отправляющую и принимающую стороны, имеющие одинаковую структуру памяти для своих структур.Это не может быть правдой по ряду причин.Некоторые включают один на чипе PowerPC, а другой на чипе Intel x86.Или один на компьютере с Windows, скомпилированным с Visual Studio, а другой на компьютере с Linux, скомпилированным с помощью gcc.Или, может быть, кто-то подправил некоторые флаги компилятора, из-за которых структура структуры по умолчанию будет другой.Любое количество причин.
На самом деле, вы должны использовать платформу сериализации, как все здесь предложили.Я бы предложил буферы протокола Google или Boost serialization Framework , с которыми уже связались другие люди.Но есть и много других.
Еще одна инфраструктура сериализации, о которой следует упомянуть, потому что она невероятно быстрая (почти такая же быстрая, как прямая выгрузка образа памяти структуры в сокет): Cap'n Proto .