Winsock - przesyłanie struktury zawierającej wektor

0

Witam.

Od jakiegoś czasu borykam się z małym problemem, polegającym na przesłaniu poprzez socket-y struktury, której składnikiem jest kontener vector z biblioteki STL.

Struktura:

 
struct Packet
{
	int         id;
	std::string name;
	std::vector<int> list;
};

Przykład wysyłania struktury przez aplikację klienta:

 
Packet      *   objPacket;
objPacket = new Packet();

objPacket->id   = 1;
objPacket->name = "Packet name"; 
objPacket->list[0] = 12;


bytesSent = ::send(mainSocket, reinterpret_cast<char*>(objPacket), sizeof(*objPacket), 0);


delete objPacket;

Odbieranie danych przez aplikację serwera:

 
Packet  *  objPacket;

objPacket = new Packet();

bytesRecv = ::recv(socket, reinterpret_cast<char*>(objPacket), sizeof(*objPacket), 0);

std::cout << "Packet ID   : " << objPacket->id << std::endl;
std::cout << "Packet Name : " << objPacket->name << std::endl;
std::cout << "List size   : " << objPacket->list.size() << std::endl;
std::cout << objPacket->list[0] << std::endl;

delete objPacket;

Wartości pól id, name przesyłane są prawidłowo.

Natomiast problem pojawią się z wartościami elementów wektora list.

Rozmiar wektora jest odczytywany poprawnie, co sugeruje że część danych tego obiektu jest przesyłana poprawnie.

Niestety wszystkie pola wektora mają wartość równą 0.

Może ktoś z Was wie gdzie popełniam błąd lub jakie inne rozwiązanie mogę zastosować do przesłania tego typu struktury.

Program realizuje w środowisku Visual Studio dla systemu operacyjnego Windows ( XP, 7 ).

Pozdrawiam

1

A wiesz jak vector<> przechowuje dane? Sprawdź ;) On to trzyma w tablicy dynamicznej! To znaczy że sam obiekt vector<> ma tylko wskaźnik do danych. Zresztą zrób sobie sizeof() na tym vectorze i zobaczysz że on wcale nie zajmuje tyle ile byś się spodziewał.

1

Trzeba po prostu przesyłać normalne statyczne tablice char[] i int[].

0

Dziękuję za Wasze odpowiedzi.

Łudziłem się, że oszczędzę sobie trochę pracy i wykorzystam kontenery STL, ale skoro nie ma wyjścia to trudno.

Korzystając z okazji chciałem zapytać o jeszcze jedną rzecz.

Otóż, czy możecie mi polecić jakąś alternatywę dla Windows-owych socket-ów?

Pozdrawiam

0

Ale taką wysokopoziomową alternatywę? Idąc historycznie od najstarszych rozwiązań: RPC, CORBA, ICE (produkt firmy ZeroC), WebServices.

1 użytkowników online, w tym zalogowanych: 0, gości: 1