CSocket::Send sendet nur einen null terminierten String - wie ändere ich das?



  • Hallo!
    Ich benutze folgende abgeleitete Klasse:

    class CWinsock : public CSocket

    Somit benutze ich auch CSocket::Send um meine Daten zu verschicken. Nun möchte ich Dateien verschicken. Wenn ich sie beim Server rauslasse sind sie noch komplett. Jedoch wenn sie beim Client ankommen gehen die Daten nur bis zum ersten '\0' - ist nicht wirklich gut um Dateien zu verschicken 😉
    Wenn ich beim Server die Daten die ich verschicke wieder in eine Datei schreibe ist die Datei komplett => da liegt kein Fehler, die Länge der Daten die ich verschicke ist auch zu 100% richtig...beim Client gebe ich auch nicht an zu wenig empfangen zu dürfen, jedoch geht es trotzdem nur bis zum ersten NULL ... na subba

    Wisst ihr wieso?

    WinSOCKER 😉



  • Hi,

    Ich nehme an der Buffer beim Empfänger ist erfolgreich mit allen Daten gefüllt (muss ja so sein, da der Buffer dann in eine Datei geschrieben wird und die Datei, wie du gesagt hast, vollständig ist).
    Ich glaube, dass das Problem darin besteht, dass du den Buffer in einen Nullterminierten String (CString) konvertierst und dann mit z.B. MessageBox ausgibst.
    Beim Konvertieren in einen Nullterminierten String gehen die Daten dann verloren (obwohl im Buffer die Daten vollständig vorhanden sind).

    Grüße Rapha



  • Hallo! Nein ich arbeite nur mit char * s



  • Hi

    ach, hab dich missverstanden, sorry.

    Dachte die Daten wären komplett wenn du sie beim Client abspeicherst.
    😞 😞

    Grüße Rapha



  • na doll 🙂 Ist CSocket unfähig Daten zu versenden obwohl sie 0terminiert sind oder was?



  • Habt ihr selbst nie mit MFC Sachen verschickt die ein \0 hatten oder wieso weiß das niemand? Auf viel schwereres habt ihr doch auch immer Antworten 😞



  • Mit ziemlicher Sicherheit kommen die Daten richtig an, du benutzt nur danach irgendwo eine Kopier- oder Ausgabefunktion, die von einer Nullterminierung ausgeht. Da aber hier niemand Lust hat, solange zu raten, bis du "Bingo" rufst, wirst du wohl, um Antworten zu bekommen, mal den Code herzeigen müssen.



  • Naja ok...der Code zum Datei verschicken interessiert nicht da er da 100%igst richtig abgegeben wird...ich schreibe danach ja das abgesendete in eine Datei und es ist identisch, hier der Code des Clients, der empfängt:

    OnReceive()
    {
    	char *pBuf = new char[10250000];
    	int iBufSize = 10240000;
    	int iRcvd;
    	CString strRecvd, temp;
    	// Nachricht empfangen
    	iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
    
    	// Wurde etwas empfangen?
    	if (iRcvd != SOCKET_ERROR)
    {
    
    		if(pBuf[0] == '!' && pBuf[1] == 'F')
    		{
    			ReceiveFile(pBuf, iRcvd);
    		}
    }
    }
    
    ReceiveFile(char *buffer, int iRc)
    {
    	int iRcvd;
    	char * saveFile = new char[10240000];
    
    	memcpy(saveFile, buffer, iRc);
    
    	int iPos = iRc;
    
             CString strRecvd;
    
    	strRecvd = buffer;
    
    	while(strRecvd.Find("ENDE DES SENDINGS") == -1)
    	{
    		iRcvd = m_sConnectSocket.Receive(buffer, 1024000);
    
    		if (iRcvd != SOCKET_ERROR)
    		{
    			memcpy(saveFile + iPos, buffer, iRcvd);
    			iPos += iRcvd;
    			strRecvd = strRecvd + buffer;
    
    		}
    
    	}
    
    	strRecvd.Replace("ENDE DES SENDINGS", "");
    
             WriteFile(saveFile, iPos);
    
    	delete [] saveFile;
    }
    

    Ich wüsste nicht wo hier eine Funktion von einem nullterminierten String ausgeht..

    Winsocker



  • Winsocker schrieb:

    Ich wüsste nicht wo hier eine Funktion von einem nullterminierten String ausgeht..

    Ich schon. Der Zuweisungsoperator von CString.



  • Rapha schrieb:

    Ich nehme an der Buffer beim Empfänger ist erfolgreich mit allen Daten gefüllt

    Rapha schrieb:

    Ich glaube, dass das Problem darin besteht, dass du den Buffer in einen Nullterminierten String (CString) konvertierst und dann mit z.B. MessageBox ausgibst.

    So weit daneben lag ich gar nicht 😉


Anmelden zum Antworten