Hallo!
Ich hoffe ihr könnt mir bei einem kleinen Problem mit Winsock helfen. Ich sitze nun geraume Zeit daran, Datendateien zu verschicken. Das ganze soll, wenn es fertig ist, ein Update-Programm als Winapi werden.
Aber wenn der Server die Daten an den Client versendet kommen diese zwar an, aber nur bruchstückhaft. Die compare-Funktion vom Hex-workshop zeigt an, dass Die Daten flächenweise ankommen, aber auch Teile mitendrin fehlen. Vor allem der letzte Teil fehlt, so das eine 200KB Datei als 20KB ankommt...
Hier ist die Senderoutine des Servers. Die Version des Clients wird in fVersion übergeben und SOCKET s ist der verbundene Socket.
Wie ihr bestimmt gemerkt habt, liest er die zu schickenden updates aus einer Datei aus. Hier mal ein Beispiel dafür:
Hier die Empfangsroutine des Clients:
Ich glaube der Wurm steckt im Client. Wie man sieht hab ich schon versucht, das Ganze gleich in eine Datei zu schreiben. Bei ios::binary passiert nichts, nur ios:
ut kommt die bruchstückhafte Datei an. In diesem Fall (wenn ich als constant char* sende) kommt keine Übereinstimmung in Quell und Zieldatei zustande. 
Ich hab mal die Übertragungsergebnisse vom char[200] senden als Dateianhang hochgeladen.
Danke schonmal für eure Hilfe/Aufmerksamkeit
Ich hoffe ihr könnt mir bei einem kleinen Problem mit Winsock helfen. Ich sitze nun geraume Zeit daran, Datendateien zu verschicken. Das ganze soll, wenn es fertig ist, ein Update-Programm als Winapi werden.
Aber wenn der Server die Daten an den Client versendet kommen diese zwar an, aber nur bruchstückhaft. Die compare-Funktion vom Hex-workshop zeigt an, dass Die Daten flächenweise ankommen, aber auch Teile mitendrin fehlen. Vor allem der letzte Teil fehlt, so das eine 200KB Datei als 20KB ankommt...
Hier ist die Senderoutine des Servers. Die Version des Clients wird in fVersion übergeben und SOCKET s ist der verbundene Socket.
Code:
SendUpdate(SOCKET s,float fVersion)
{
vector <string> UpdateStrings;
string strULine,sBuffer,sFile,sCountBuffer,sVerBuffer;
char cData[200];
int count=1;
float fVerRead;
const char* cchFilestr="";
fstream update("Update.txt",ios::in);
while(!update.eof() )
{
getline(update,strULine);
UpdateStrings.push_back(strULine);
}
for (int i=0;i<UpdateStrings.size();i++)
{
sBuffer=UpdateStrings[i];
if (sBuffer.substr(0,12)=="NewVersion=V")
{
sVerBuffer=sBuffer.substr(12,sBuffer.size()-12);
fVerRead=atof(sVerBuffer.c_str());
}
if (sBuffer.substr(0,5)=="FILE=" && fVerRead>fVersion)
{
sFile=sBuffer.substr(5,sBuffer.size()-5);
fstream file(sFile.c_str(),ios::in|ios::binary);
cchFilestr="SENDE";
send(s,"cchFilestr",sizeof(cchFilestr),0);
cchFilestr=sFile.c_str();
send(s,cchFilestr,sizeof(cchFilestr),0);
while (!file.eof() )
{
cData[count]=(char) file.get();
count++;
if (count==200)
{
count=1;
cchFilestr=cData;
send(s,cchFilestr,sizeof(cchFilestr),0);
}
}
cchFilestr=cData;
send(s,cchFilestr,sizeof(cchFilestr),0);
file.close();
send(s,"FILEEND",sizeof("FILEEND"),0);
}
if (sBuffer=="ENDE") return 1;
}
}
Code:
NewVersion=V1.1
FILE=TEST.dat
ENDE
Hier die Empfangsroutine des Clients:
Code:
void CheckForUpdates()
{
char cBuffer[256];
lene=recv(s,cBuffer,sizeof(cBuffer),0);
//cBuffer[lene]='0';
if (lene != SOCKET_ERROR)
{
(int)SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM) cBuffer);
//fstream file("lala.txt",ios::out|ios::app|ios::binary);
//file << szBuffer;
//file.close();
}
}


Ich hab mal die Übertragungsergebnisse vom char[200] senden als Dateianhang hochgeladen.
Danke schonmal für eure Hilfe/Aufmerksamkeit
