recv() + vector

0

czy moge pogodzic ze soba funkcję recv() z vectorem? chodzi mi tu o przekazywanie wskaznika vectorowi wraz z nadejsciem pakietu. z funkcja send() nie mam takiego problemu co z wyzej wymieniona. przy recv() wyskakuje blad krytyczny podczas debugowania wspominajacy cos o pamieci. ale dlaczego, jezeli ja roznego rodzaju typy tablic i zmiennych - ich wskazniki przekazuje do tej funkcji i jest wszystko okey, zas z vectorem jest blad wczesniej wspomniany?

dziala bez zarzutu:

int tab[6];
recv(sock,(char*)&tab,24,NULL);
 
 
blad krytyczny podczas debugowania:

vector<void*> v;
recv(sock,(char*)&v,24,NULL);
0

jesteś pewien że chcesz stworzyć vector<void*> v ?

0
static_cast<char *>(&(v[0]))

To będzie odpowiednik tego ze zwykłą tablicą. Czy to zadziała i ma sens użycie takiego vectora - nie wiem.

0

Pamiętajmy, aby nadać vectorowi odpowiedni rozmiar i nie zakładajmy, że pomieści wszystkie dane, czyli:
vector<char> v(24) lub vector<char> v(24, 0); - jak kto woli, ustalamy rozmiar przy tworzeniu vectora lub używamy resize()
v.resize(24) lub v.resize(24, 0);

a potem
recv(sock, &v.front(), 24, null);

0

Nie pomaga to. Hmm same problemy z tym STD'owym vectorem (jeśli chodzi o zewnętrzność). Lepiej napisze wlasna klase ktora bedzie przyjmowac i zdejmowac ze stosu dane, a takze zawierac inne potrzebne informacje. Ok dzieki chlopaki za pomoc :)

0

A możesz pokazać swój kod? Bo wydaje mi się, że nie jest to wina vectora, tylko tego jak go użyłeś.

0

Spróbuj raczej reinterpret_cast<char*>(&v[0])
Miałem podobny problem ze zmianą z void* na int*, bo przy dodawaniu wyskakiwało mi, że próbuję wykonywać działania na void* i program się nie kompilował.

0

No co Ty, wskaźnik na void się robi za pomocą static_cast. Dopiero w nowym standardzie w ogóle dodali możliwość używania do tego reinterpret_cast.

http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to-whatever

0

vector<void*> myvec;
int i1 = 54363;
int i2 = 10678;
int i3 = 15578;
int i4 = 99665;
myvec.push_back(&i1);
myvec.push_back(&i2);
myvec.push_back(&i3);
myvec.push_back(&i4);
send(client->_socket,(char*)&myvec,20,NULL);

Cholera nie mam konta, a niechcacy wyslalem posta...

A tutaj odbieranie:

vector<void*> message;
message.resize(4);
recv(this->sockclient,(char*)&message.front(),20,NULL);

0

Czyli robisz tak: ustawiasz wielkość vectora na 4 elementy (poprzez push_back() w pierwszym przypadku i resize(4) w drugim). Zakładam maszynę 32-bit - czyli sizeof(void*) to 4 bajty - razem 16 bajtów pamięci zarezerwowanej przez vector. Następnie używasz send() i recv() i w obu przypadkach podajesz, że mają do wysłania/odczytania 20 bajtów - więc funkcje wyjeżdżają poza zaalokowany obszar pamięci.

EDIT: prawdopodobne jest, że vector::capacity() zwróci większą wartość, ale i tak proponuję sprawdzenie kodu. Dodatkowo właśnie zauważyłem, że w send() podajesz adres vectora zamiast adres pierwszego jego elementu (powinno być &myvec.front()).

0

po co wysyłasz wskaźniki do intów przez sockety, lepiej wyślij te liczby :P

vector<int> myvec;
int i1 = 54363;
int i2 = 10678;
int i3 = 15578;
int i4 = 99665;
myvec.push_back(i1);
myvec.push_back(i2);
myvec.push_back(i3);
myvec.push_back(i4);
send(client->_socket,(char*)(&myvec[0]),sizeof(int)*myvec.size(),NULL);

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