Datei kommt über CSocket nicht an ...



  • Dann wird Deine Datei in mehrere Einzelpakete geteilt. Du musst sie also mit jedem OnReceive einzeln zusammensetzen bis dataLen erreicht ist.



  • Ok, und wie mach ich das ?
    Sorry bin blutiger Anfänger ...



  • void CGetFile::OnReceive()
    {
        //member byte *m_data vorher irgendwo mit NULL initialisieren
        if(m_data==NULL) //m_dataLength wurde noch nicht empfangen
        {
           m_sFile.Receive(&m_dataLength, 4); //member int m_dataLength
           m_received=0;                 //member-Variable vom Typ int
           m_data = new byte[m_dataLength];
        }
        //liegen Daten an?
        len=m_sFile.Receive(m_data+m_received, m_dataLength-m_received);
        if(len>0)m_received+=len;
        //Dateiende erreicht?
        if(m_received==m_dataLength)
        {
           CFile destFile(m_strDatei, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
          destFile.Write(m_data, dataLength); // Write it
          destFile.Close();
          delete m_data;
          m_data=NULL;
          //m_sFile.Close();  //edit verschoben (wenn das überhaupt benötigt wird dann hier)
        }
    }
    

    [ Dieser Beitrag wurde am 25.08.2002 um 12:41 Uhr von pfalzmarc editiert. ]



  • Ok funktionieren tut der Code jetzt so:

    if(m_bReceive == FALSE) //m_dataLength wurde noch nicht empfangen
        {
    
           m_sFile.Receive(&m_dataLength, 4); 
           m_received=0;                     
    
           m_bReceive = TRUE;
    
        }
        byte *m_data = new byte[m_dataLength];
        int iLen;
        iLen=m_sFile.Receive(m_data+m_received, m_dataLength-m_received);
    
        if(iLen>0)
        {
            m_received = m_received + iLen;
        }
        int iState = m_dataLength/100*m_received;
        m_pState.SetPos(iState);
    
        //Dateiende erreicht?
        if(m_received==m_dataLength)
        {
          CFile destFile(m_strDatei, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
    
          destFile.Write(m_data, m_dataLength); // Write it
          destFile.Close();
          delete m_data;
          m_sFile.Close();
          GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
          GetDlgItem(IDC_BCANCEL)->EnableWindow(FALSE);
          //Statusmeldung
          m_strStatus= "Transfer beendet.";
          UpdateData(FALSE);
        }
    

    Aber die Datei wird immer noch nicht richtig geöffnet ...
    Eine mp3-Datei z.B. wird zwar von WinAmp geöffnet aber kann dann ohne begründung nicht abgespielt werden.
    Eine exe-Datei wird nur im dos-fenster aufgerufen, mehr passiert aber auch nicht.

    Das ist irgendwie alles ein bischen seltsam



  • wundert mich nicht. Du allokierst mit jedem Durchlauf neuen Speicher für m_data. Der alte geht irgendwo im Nirvana verloren. Das darf nur in der ersten if-Abfrage passieren. Nicht außerhalb.



  • Ok, aber wenn ich das byte *m_data; in die erste if abfrage schreibe ist es unten ja nicht definiert... (Was ja auch logisch ist..)
    Aber wo (und vorallem wie) kann ich m_data definieren ?



  • in dem Headerfile Deiner Klasse - als Membervariable



  • hab ich schon probiert ...
    da kommt dann nen fehler...



  • Was für ein Fehler?



  • Ne, Sorry...
    geht doch als private.

    Tanks a lot... Das war sehr gute hilfe!!!!!!!!!!!!!!!!!!!!!!!


Anmelden zum Antworten