C++ śmieci przy powtórnych ładowaniach pakietu

0

Cześć,
piszę sobie prosty program wysyłający i odbierający pakiety z/do sieci, wysyłam sobie pliki tekstowe.
Mam niezły bajzel w kodzie, ale generalnie działa, więc nie ruszam.
Mam problem
gdy wyślę plik za pierwszym razem - odbiorę pakiety po kolei, zrzucę je do pliku i załaduję je na ekran - jest wszystko ok, lecz gdy wyślę ten sam plik któryś raz z kolei przy tym samy odpaleniu programu w miejscu, gdzie kończą się dane z jednego pakietu, a rozpoczynają z drugiego, dostaję krzaki, ucina mi tekst itd.
Pętla łapiąca pakiety wygląda tak:

 while(1){

    if(( ile = recvfrom( sockfd, buf, 4096 - 1, 0,
    ( struct sockaddr * ) & LACZACY, & dlugosc ) ) == - 1 ) {
        perror( "recvfrom" );
                  int blad=WSAGetLastError();
                  string bladek = "Blad to "+blad;
         Application->MessageBox(bladek.c_str(),"blad", NULL);

    }


    buf[ ile ] = '\0';




   string sciezka=Form1->Sciezka+"\\zapis.txt";
      Form1->Memo2->Lines->Add(sciezka.c_str());



                             PrzemielPakiet(buf, ile, naglowek, sciezka);
                             Form1->Memo1->Lines->LoadFromFile(sciezka.c_str());


         }
 

A używana funkcja PrzemielPakiet wygląda tak:

 void PrzemielPakiet(char pakietchar[], int dlugosc, char naglowek[], string sciezka){
    string pakiet(pakietchar);
    for(int i=0;i<dlugoscnaglowka;i++){
        naglowek[i]=pakiet[i];
    }
    
    
    string costam=pakiet;
    string reszta = costam.substr (dlugoscnaglowka, dlugosc-dlugoscnaglowka+1);
    naglowek[dlugoscnaglowka-1]='\0';
    
    int i=0;
    if(naglowek[43]!='0' && naglowek[42]!='0'){
        ofstream zapis(sciezka.c_str(), ios::out|ios::app);
        zapis<<reszta;
        zapis.close();
        }else{
        remove(sciezka.c_str());
        ofstream zapistmp(sciezka.c_str());
        
        zapistmp.close();
        
    }
    reszta.clear();
    
}

Podejrzewam, pewnie niesłusznie, że są to "przebitki" wynikające z jakiegoś złego zakresu tych stringów.
Krótkie objaśnienie do funkcji PrzemielPakiet - rzucam na nią pakiet, z którego pierwsze 44 znaki to mój nagłówek, nieistotny w tym miejscu, jeżeli znaki 42, 43 nie są zerowe(nie jest to pakiet inicjujący, też nieistotne dla problemu raczej) to zrzucam resztę do pliku.
Zrzuca się ok, gdy jest to pierwsze przesłanie w obecnej sesji, później "na krawędziach", mam różne cyrki.
Zdarzają się znaki nowej linii, zdarzają się krzaki, a za którymś razem mam po prostu już chyba wyciek pamięci(access violation)

Jak sobie z tym poradzić? Czy może pomysł jest bez sensu i jakoś inaczej to wykonać?(jak najlepiej? potrzebuję po prostu zrzucać z kolejnych pakietów dane od pewnego miejsca do pliku, pierwszy pakiet nie zawiera danych, reszta już tak)

0

ten kod oslabia na wielu plaszczyznach, ale najbardziej podejrzane jest to:

string pakiet(pakietchar);
for(int i=0;i<dlugoscnaglowka;i++){
naglowek[i]=pakiet[i];
}

bedzie dobrze dzialac dopoki nie masz 0x00 w ciagu

0

Więc jak to rozwiązać inaczej? Potrzebuję po prostu przepisać określoną ilość znaków z tablicy pakiet do tablicy naglowek, nie obchodzi mnie na tym etapie co tam jest, chce dokładnie to samo mieć tu i tu.

0

wyeliminuj zmienna pakiet, wiecej nie dam rady napisac - nie pisze z pc dzisiaj

0

memcpy(naglowek,pakietchar,dlugoscnaglowka);

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