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!!!!!!!!!!!!!!!!!!!!!!!