Witam,
piszę malutką gierkę sieciową i natrafiłem na taki problem, że nie wiem w jaki sposób mam przesłać współrzędne z klienta na serwera. Otóż kiedy przesyłam cokolwiek, to musi to być w postaci char`u, więc jak mam to zamienić na zmienną typu int? Dajmy na to że przesyłam taki tekst"134 165" i teraz chciałbym z tego otrzymać dwie zmienne o wartości 134 i 165, czyli x i y.
Jak mógłbym to zrobić?
Z góry dziękuje za odpowiedź.
naucz się porządnie obsługiwać zwykłe pliki. przesyłanie (zapis) i odbieranie (odczyt) obsługuje się analogicznie tak samo
Piszesz grę a nie znasz atoi() albo stringstream ? :>
Jestem samoukiem, dlatego jeżeli nie mam potrzeby czegoś poznania, to tego nie robię.
Powracając do pytania, chcę aby "123 321" zamienić na dwie zmienne liczbowe 123 i 321.
Dzięki [losowa nazwa], za podsunięcie mi funkcji atoi, lecz i tak wpierw muszę ten ciąg znaków rozdzielić na dwa.(ciąg ten nie ma określonej długości.
Zatem użyj stringstream i wczytaj sobie z niego 2 inty. Albo napisz sobie prostą funkcję, która z tego stringa robi dwa... (o ile w C++ nie ma jakiegoś split'a).
Takie rozwiązanie z przesyłaniem tekstowej formy liczb wprowadza niepotrzebny narzut. Zdecyduj się na big-endian lub little-endian i przerzucaj po całych bajtach.
Okey, dzięki ponownie [losowa nazwa].
Przedtem nie widziałem o co ci chodzi z tym stringstream, ale potem sobie przypomniałem że przerywa on wczytywanie na białym znaku, więc poszło bardzo łatwo.
Zobacz sobie ten sposób:
struct wspolrzedne
{
int x,y,z;
};
...
int main()
{
wspolrzedne x{1,2,3};
...
send(socket, reinterpret_cast<char*>(&x), sizeof(wspolrzedne), 0);
...
return 0;
}
Pisane na szybko. Tutaj zamieniasz strukture na bajty(char'y), sizeof(wspolrzedne) zwraca ile bajtów zajmuje Twoja struktura. Pamiętaj, żebyś nie zrobił czegoś takiego:
wspolrzedne* x=new wspolrzedne;
send(socket, reinterpret_cast<char*>(x), sizeof(x), 0);
W tym przypadku sizeof zwróci 4B, bo tyle zajmuje wskaźnik gdzie Twoja struktura ma 3*4B=12B. Wysyłając w ten sposób musisz sobie ustalić nagłówki, np wysyłasz int'a o wartości 9191 a później strukturę ze współrzędnymi - dzięki nagłówkom odbiorca wie jaką strukturę później odebrać. Odbieranie analogicznie:
wspolrzedne x;
...
int IloscBajtowOdebranych=recv(socket, reinterpret_cast<char*>(&x), sizeof(wspolrzedne), 0);
...
Tylko tu musisz napisać sobie funkcje która będzie odbierała dane zanim IloscBajtowOdebranych!=sizeof(wspolrzedne).