Datei kommt über CSocket nicht an ...
-
Hallo,
ich habe volgendes gemacht:Server:
m_sFile.Accept(m_sFileAccept); // Die Sockets sind in ner Klasse definiert... CFile myFile; myFile.Open(m_strDatei, CFile::modeRead | CFile::typeBinary); int myFileLength = myFile.GetLength(); // Going to send the correct File Size m_sFileAccept.Send(&myFileLength, 4); // 4 bytes long byte* data = new byte[myFileLength]; myFile.Read(data, myFileLength); m_sFileAccept.Send(data, myFileLength); //Send the whole thing now myFile.Close(); delete data; m_sFile.Close(); m_sFileAccept.Close();
Client:
#define PORT 34000 m_sFile.Create(); m_sFile.Connect(m_strIP, PORT); void CGetFile::OnReceive() { m_sFile.Receive(&dataLength, 4); byte* data = new byte[dataLength]; m_sFile.Receive(data, dataLength); //Get the whole thing CFile destFile(m_strDatei, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); destFile.Write(data, dataLength); // Write it destFile.Close(); delete data; m_sFile.Close(); }
Folgendes Problem:
Der Server sendet zwar dem Cleint die Datei, die wird auch erstellt...
Aber leider kann man diese nicht öffnen ...
Also muss da ein übertragungsfehler drinn sein ?!Währe schön wenn mir jemand helfen könnte ...
Thx[ Dieser Beitrag wurde am 25.08.2002 um 10:53 Uhr von Spritey editiert. ]
-
Prüfe mal den Rückgabewert von Receive.
-
Also es kommt kein Error ...
-
und die zurückgelieferte Länge des 2. Receive stimmt mit dataLength überein?
-
Wenn du das hier meinst:
iLen = m_sFile.Receive(data, dataLength); //Get the whole thing if (iLen == dataLength) { MessageBox("Yes"); } else { MessageBox("No"); }
Da kam 'No' raus (ziemlich oft hintereinander ...)
-
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!!!!!!!!!!!!!!!!!!!!!!!