Probleme mit verschicken von Dateien



  • mit dem Port gibt es keinerlei Probleme und die Dateien sind MPEG Dateien. Ich verschicke ja auch die Filegröße usw. vorher weg und das funktioniert einwandfrei. Ich hatte vorher meinen pBuf einfach in eine CString Variable reingeschrieben, das allerdings nicht funktioniert. Ich habe festgestellt, das ich pBuf in ein String umwandeln muss. Nur wie mache ich das am Besten?


  • Mod

    Wieso musst Du den pBuf in einen String umwandeln? Wie kommst Du darauf?
    Zudem ist Dein pBuf bereits ein Buffer mit Daten vom Typ char*, wenn es sich um einen MPEG Datei handelt dann sind da sicherlich auch nicht Ascii Zeichen dabei, aber das sollte nichts machen.

    Wie versendest Du denn?



  • ich versende über winsock...das heißt ich versende die Daten als Strings und wandel sie dann gegebenenfalls auf der anderen Seite um. Sobald ich pBuf in ein String reinschreibe, kann das Programm auf der anderen Seite mit den Daten nichts anfangen. Habs auch mal ohne verschicken probiert. Wenn ich direkt pBuf verwende klappt die Dateierstellung, sobald ich den Inhalt einfach in ein String schreibe, funktioniert es nicht.


  • Mod

    Twinzz schrieb:

    ich versende über winsock...das heißt ich versende die Daten als Strings und wandel sie dann gegebenenfalls auf der anderen Seite um. Sobald ich pBuf in ein String reinschreibe, kann das Programm auf der anderen Seite mit den Daten nichts anfangen. Habs auch mal ohne verschicken probiert. Wenn ich direkt pBuf verwende klappt die Dateierstellung, sobald ich den Inhalt einfach in ein String schreibe, funktioniert es nicht.

    Das versteheich nicht. Wo steht das ich über send nur Text Daten versenden darf. Bei der send funktion wird ein Puffer übergeben und eine Länge...



  • Genau das habe ich auch vorher gedacht, allerings funktioniert es leider nicht. auch wenn ich pBuf direkt verschicke, kann mir mein Empfänger nicht die Datei wieder zusammenstellen. Habe den Fehler soweit ausgegrenzt, das er mir vor schreiben der Datei eine Fehlermeldung gibt. "Debug Assertion Failed!"
    Ich weiß auch nicht mehr weiter...



  • Mir ist gerade eingefallen, das ich ja auch beim Empfänger die Daten erstmal in ein String reinschreibe 😮
    Ich hoffe, das das die Lösung ist....



  • Es funktioniert trotzdem nicht...hier ist mal der Code beim Empfänger. Vielleicht sehe ich vor lauter Bäumen den Wald nicht mehr...

    char *pBuf = new char[1025];
    	int iBufSize = 1024;
    
    	int iRcvd;
    
    	CString strRecvd;
    
    	//Nachrichten empfangen
    	iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
    
    	//Wurde etws empfangen?
    	if (iRcvd == SOCKET_ERROR)
    	{
    	}
    	else
    	{
    
    		pBuf[iRcvd] = NULL;
    		// Nachricht in einen CString kopieren
    		strRecvd = pBuf;
    
    		if(strRecvd == "FILENAME")
    		{
    			m_sFileName = m_cstrReceived;
    			m_cstrReceived = "";
    			strRecvd = "";
    			pBuf="";
    
    			AfxMessageBox(m_sFileName);
    		}
    
    		if(strRecvd == "FILESIZE")
    		{
    
    			AfxMessageBox(m_cstrReceived);
    			FileSize = atoi(m_cstrReceived);
    			m_cstrReceived = "";
    			strRecvd = "";
    			pBuf="";
    			AfxMessageBox("Filesize empfangen");
    		}
    
    		if(strRecvd == "END")
    		{
    			AfxMessageBox("File empfangen");
    			//OnCreateEssanceFile(pBuf);
    
    			AfxMessageBox(" File wird erstellt");
    			CFile newFile;
    			CString FilePath = m_sPathName + "\\" + m_sFileName;
    
    			AfxMessageBox(FilePath);
    
    			newFile.Open(FilePath, CFile::modeCreate | CFile::modeWrite );
    
    			AfxMessageBox("File geöffnet");
    
    			newFile.Write(pBuf, FileSize);
    
    			AfxMessageBox("File geschrieben");
    
    			newFile.Close();
    
    			m_cstrReceived="";
    			strRecvd = "";
    
    		}
    		else
    		{
    		m_cstrReceived += strRecvd;
    		}
    
    		//AfxMessageBox("File erstellt");
    
    		UpdateData(FALSE);
    	}
    


  • Hmm...etwas Code wäre da noch interessant. Wie sendest du denn?



  • ich sende über winsock...

    send(clients[ClientMeta],m_cstrMetadaten,(int)strlen(m_cstrMetadaten),0);
    

  • Mod

    Du kannst nicht 100% davon ausgehen, dass ein Block, der mit send gesendet wird in einem einzigen Receive ankommen.

    Weiterhin müsstest Du Dir ein eigenes Protokoll ausdenken. Zudem werden binäre Daten übertragen. CString arbeitet aber mit 0 terminierten Strings. Wenn nun also eine 0 in Deinen gesendeten Daten vorkommt so würde diese den String beenden.

    So wie Du Deinen Code hier zeigst wird es nie funktionieren!

    Also:
    1. Protokoll überlegen.
    2. Klar sein, dass der gesendete Datenstream in einem Receive eben auch in mehreren Blöcken ankommen kann.
    3. Mit Puffern arbeiten (nicht mit CString), und immer darauf achten, dass die gesendete Länge einzelner Blöcke bekannt ist.



  • Vielen Dank schonmal für deine Hinweise. Ist mir auch vorhin in Gedanken gekommen, die empfangen Daten einfach nicht in Strings zu schreiben. Ich verschicke nach dem versenden des Files immer ein END und überprüfe auf der anderen Seite ob dieser gerade empfangen wird, wenn nicht, wird alles in einen String kopiert, wenn ja, wird der String in einen anderen String kopiert und so filtere ich meine Daten.
    kann man zwei char Variablen eigentlich auch einfachso zusammenstzen?...ansonsten muss ich mit der Filegröße arbeiten.



  • Wie schaffe ich es nun, das Problem mit der 0 umzugehen? Sobald ich versuche mein pBuf zu versenden, kommt auf der anderen Seite nichts an, weil er anscheinend nichts verschickt. die ersten 3 Zeichen von MPEG Dateien sind nämlich 000...ich bin echt langsam am verzweifeln... 😞


  • Mod

    Es ist doch schon mehrfach geschrieben worden. Arbeite mit festen Puffergrößen.
    Solange Du auf der Sendeseite etwa strlen einsetzt kann es nicht gehen!

    Dein Code:
    send(clients[ClientMeta],m_cstrMetadaten,(int)strlen(m_cstrMetadaten),0);
    kann nicht gehen!



  • Du brauchst garnichts in einen String umwandeln.

    Du kannst auch den Buffer als z.B.
    byte* data = new byte[1025];

    definieren.

    Receive brauchst du in einer Schleife. Diese wird erst beendet wenn keine Daten mehr am Socket liegen.
    Die Daten am Socket werden ja nicht in einem Übertragen sondern in Packeten gesteckt.
    Es kann dan sein das du bereits Daten vorliegen hast aber eben noch nicht alle.
    Aber Grundsätzlich ist String CString oder was auch immer für eine string quatsch.
    Man kann auch BIN übertragen.


Anmelden zum Antworten