Jak należy przesyłać dane przez TCP.

0

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ź.

0

naucz się porządnie obsługiwać zwykłe pliki. przesyłanie (zapis) i odbieranie (odczyt) obsługuje się analogicznie tak samo

0

Piszesz grę a nie znasz atoi() albo stringstream ? :>

0

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.

0

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).

1

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.

0

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.

0

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).

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