Jak wysłać strukturę w ktorej dane wczytane sa z klawiatury - sockety

0

Cześć, piszę na studiach aplikacje klient-serwer, taki prosty chacik działający na wątkach. Do obsługi np. logowania mam stworzoną strukturę, której pola są umieszczane w innej ta wysyłana jest do serwera. Tak one wyglądają:
Login

struct Login {
    char username[128];
    char passwd[128];
};

Msg

struct Msg {
    unsigned int msgID;
    unsigned int contentSize;
    char payload[1];
};

w payload trzymam login i hasło. Jeśli zrobię hardcoding po stronie klienta, np.

Login loginData = {"Sashore", "Haslo"};

i wyśle to, serwer otrzymuje poprawne dane, ale jeśli zrobię tak:

Login* loginData = new Login;

cout<<"Podaj nazwe:\n";
cin>>loginData->username;
cout<<"Podaj haslo:\n";
cin>>loginData->passwd;

to serwer otrzymuje jakieś śmieci. Podobnie sprawa ma się z rejestracją, użytkownik podaje i powtarza hasło, wypisując oba pola dane są identyczne (przy podaniu tych samych ciągów oczywiście) ale kiedy przychodzi do warunku sprawdzającego to nagle się okazuje że jednak hasła różnią się
Jak rozwiązać ten problem, żeby serwer otrzymał poprawne (czyli to co jest wpisane) dane?

1

Pokaż w jaki sposób wysyłasz te dane.

0

Przygotuj MCVE https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

Wybrane fragmenty nic nie mówią.

0

Dane są wysyłane tak

memcpy(msg->payload, &loginData, sizeof(Login));
send(sock, (char*)msg, msgSize,0);
2

Wysyłasz wskaźniki na dane, a nie dane. Albo wysyłaj całą strukturę, albo jakoś to rozsądnie serializuj.

1

Akurat w tym przypadku rozwiązaniem problemu będzie coś w stylu:

memcpy(msg->payload, loginData, sizeof(Login));

W Twoim oryginalnym kodzie kopiujesz dane wskaźnika na loginData, a nie tego, na co loginData wskazuje.

Fakt faktem jednak - powinieneś te dane ręcznie serializować; memcpy nie zadziała wtedy, gdy:

  • będziesz chciał wysłać jakąkolwiek klasę (np. std::string), ponieważ wyśle wskaźnik na tę klasę, a nie jej zawartość,
  • będziesz chciał wysłać liczby (poczytaj o endianness).
  • i pewnie wielu, wielu innych przypadkach.
0

Dzięki wielkie, @Patryk27, @kq
Pomogło ;)

Pozostał problem z ifem... To jest struktura rejestracji:

struct Register {
    char username[128];
    char passwd[128];
    char repasswd[128];
};

podawanie danych jest identyczne, na koniec sprawdzam warunek

if(registerData->passwd != registerData->repasswd) {
	cout<<"Hasła różnią się!\n";
	exit 0;
}

i dalej jest wysyłanie na tej samej zasadzie jak logowanie.

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