Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Winsock przesyłanie danych

Ostatnio zmodyfikowano 2016-08-29 09:49
Autor Wiadomość
CTRL85
Temat założony przez niniejszego użytkownika
Winsock przesyłanie danych
» 2016-08-29 01:55:21
Witam!

Zacząłem się interesować obslugą sieci i napotkalem na pewien problem - do przesyłanego tekstu na końcu dodawany jest jeden znak i nie mam pojęcia dlaczego tak jest.

Kod serwera:
http://pastebin.com/tqTJXUJC

Kod klienta:
http://pastebin.com/TG7EnwHz

Mała wizualizacja tego, co się dzieje:

http://iv.pl/images/27726679623116539498.png

Bardzo proszę o pomoc.

P-151189
j23
» 2016-08-29 09:49:01
Dodaje Ci ten jeden znak na końcu, bo odebrany łańcuch nie ma null-terminatora na końcu. Wystarczy go dodać:
C/C++
BackResult = recv( ClientSocket, recvbuf, recvbuflen, 0 );
if( BackResult > 0 ) {
   
    recvbuf[ BackResult ] = '\0';
   
    cout << "Bajty odebrane: " << BackResult << endl;
    cout << "Wiadomosc odebrana: " << recvbuf << endl;
    ...

Generalnie wysyłane wiadomości powinny mieć dodany na końcu jakiś znak oznaczający ich koniec, bo może być tak, że recv nie odbierze całej wiadomości za jednym razem, i wtedy może być problem.

C/C++
string TmpMsg = "";

cout << "Wiadomosc do wyslania: ";
cin >> TmpMsg;

char * sendbuf = _strdup( TmpMsg.c_str() );
Po co to strdup? Przecież możesz od razu wysłać z TmpMsg:
if( send( ConnectSocket, TmpMsg.c_str(),( int ) TmpMsg.size(), 0 ) == SOCKET_ERROR ) {...}

Nigdzie nie zwalniasz sendbuf, więc jest wyciek pamięci.
P-151191
« 1 »
  Strona 1 z 1