dziwne znaczki w Tablicy char

0

Witam
Dla wlasnej satysfakcji robie bardzo prosty komunikator sieciowy. Uzywam do tego srodowiska BCB 6 i oczywiscie socketow. problem pojawia sie przy odbieraniu danych wysylanych od drugiego uzytkownika.
pierwsza wiadomosc zazwyczaj dociera w takiej formie jak zostala wyslana, natmoniast nastepne sa jakas mieszanka poprzednich wiadomosci, i nie mogo znaleŹĆ zadnej zaleznosci dlaczego tak sie dzieje. Raz pokazuje sie wiadomosc prawidlowa a raz wyslana pare sekund wczesniej oto fragmet kodu.

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
char *Wiadomosc;    // wskaznik na przyszla tabilce znakow
int dlugosc_wiad;     //zmienna pomocnicza zliczajaca ilosc znakow
Wiadomosc = new char[255];         

dlugosc_wiad = Socket->ReceiveLength();          //sprawdznie liczby znakow przychodzacej wiadomosci
Socket->ReceiveBuf(Wiadomosc,dlugosc_wiad+1);  //zapisywanie do tablicy znakowej odebranego tekstu

String Wyswietlanie = Wiadomosc;        //konwersja na stringa alby moc swobodnie wyswietlic w memo

Memo1->Lines->Add(Wyswietlanie);
delete Wiadomosc;
}

czasami wiadomosci zawieraja nazwy komponetow programu, np " Button1" itd. Wyglada jakby C++ mial jakis problem z nadpisywaniem danych na stosie. No ale uzywam "delete" wiec za kazdym razem pamiec jest zwalniana, a moze nie powinienem tego robic?

0

a wysyłasz wiadomość z zerem kończącym C-string czy bez?
Bo na odbiorze nie widzę, żebyś dopisywał to zero tego C-string'a.

Chyba tak to powinno wygladac (nie używałem socketow wiec nie mam pewności)

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    char *Wiadomosc;    // wskaznik na przyszla tabilce znakow
    int dlugosc_wiad;     //zmienna pomocnicza zliczajaca ilosc znakow
    dlugosc_wiad = Socket->ReceiveLength();
    Wiadomosc = new char[dlugosc_wiad +1];
    dlugosc_wiad = Socket->ReceiveBuf(Wiadomosc,  dlugosc_wiad);
    if(dlugosc_wiad>=0)
        Wiadomosc[dlugosc_wiad] =0;

    Memo1->Lines->Add(Wyswietlanie);
    delete Wiadomosc;
}
0

dzieki Stary dziala wysmienicie, choc jeszcze tego nie kumam do konca. Ale zaraz to przeanalizuje.

0

Pamięć zaalokowaną przez new[] należy zawsze zwalniać przez delete[]!

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