Empfangen von der Reihenfolge der Buchse
Frage
Ich bin mit Socket-Daten von den lokalen Rechner zu Fern in TCP, Stream-Modus zu senden. Der Code in der lokalen Seite ist:
// ----------- Local
send(sd, pData, iSize, 0); // send data
Die Größe der Daten ist etwa 1 MB, so Buchse könnte es mehrere Pakete aufzuteilen. Während ich die Daten auf Remote-Seite bin recieving, ich muss separat die Daten zu empfangen und sie dann zusammen kombinieren. Der Code in der Remote-Seite ist:
// ----------- Remote : Receiving data
int iSizeThis(0);// size of a single separated data
static int iSizeAcc(0);//size of the total data I have already got.
static int iDataSize(0);// size of the original data.
// Get size
if (iDataSize <= 0)
{
if ( (iSizeThis = recv(cli_sd, (char*)&iDataSize, 4, MSG_PEEK)) == 0) {
....
} else if (iSizeThis == SOCKET_ERROR) {
....
} else {
// Allocates memory
if (iDataSize > 0)
pData = realloc(pData, iDataSize);
}
} else if (iSizeAcc < iDataSize){
// Get data.
// The size of the data is about 1Mb, so socket will divide it to several packets.
// I have to recieve the data separately, and then combine them together.
iSizeThis = recv(cli_sd, ((char*)pData) + iSizeAcc, iDataSize - iSizeAcc, 0);
iSizeAcc += iSizeThis;
//{// If I uncomment this block, the recieving order will be reversed. Why?????
// static int i(0);
// std::ostringstream oss;
// oss << i++ << "\n\n";
// oss << "iSizeThis : " << iSizeThis << "\n";
// oss << "iSizeAcc : " << iSizeAcc << "\n";
// oss << "iDataSize : " << iDataSize << "\n";
// ::MessageBoxA(this->GetSafeHwnd(), oss.str().c_str(), "---", 0);
//}
// If all the fragment are combined into pData, the save it to a file.
if (iSizeAcc >= iDataSize){
// Save to file
FILE * pFile;
pFile = fopen ("CCC.dat","wb");
if (pFile != NULL){
fwrite ( ((char*)pData)+4 , 1 , iDataSize-4 , pFile );
fclose (pFile);
}
iSizeAcc = 0;
iDataSize = 0;
}
}
Das Seltsame ist. Wenn ich den Nachrichtenblock auf Remote-Seite Kommentar-, wird die recieving Reihenfolge umgekehrt werden. Somit ist das Ergebnis der Datenfern nicht in der richtigen Reihenfolge.
Warum? (Und wie könnte ich die richtige Reihenfolge jedes Fragments?)
Vielen Dank im Voraus.
Lösung
Während die MessageBoxA Funktion ausgeführt wird, pumpt es Nachrichten an dem Fenster. Unabhängig davon, ob der Thread erwartet sie entsandte MessageBoxA sie dir.
Andere Tipps
Beim MessageBoxA (eine Sperr, Modal-Dialog) in einer Empfangsschleife ist eine grundlegend fehlerhaft Idee. Wenn Sie möchten, um die Werte sehen, die es in einem Debugger ausführen, drucken Sie sie in einen Dialog (beispielsweise ein Textfeld), geben sie an die Konsole oder steckt sie in eine Datei.