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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top