Domanda

Sto usando socket per inviare dati dal computer locale al remoto in TCP, modalità stream. Il codice nella parte locale è:

// ----------- Local
send(sd, pData, iSize, 0);  // send data

La dimensione dei dati è di circa 1 Mb, quindi il socket potrebbe dividerlo in più pacchetti. Mentre ricevo i dati sul lato remoto, devo ricevere i dati separatamente e quindi combinarli insieme. Il codice nel lato remoto è:

// ----------- 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;
    }
}

La cosa strana è. Se decomprimere il blocco messaggi sul lato remoto, l'ordine di ricezione verrà invertito. Pertanto, il risultato dei dati remoti non è nell'ordine corretto.

Perché? (E come posso ottenere l'ordine corretto di ogni frammento?)

Grazie in anticipo.

È stato utile?

Soluzione

Durante l'esecuzione della funzione MessageBoxA, invia messaggi alla finestra. Indipendentemente dal fatto che il tuo thread li stesse aspettando, MessageBoxA te li ha spediti.

Altri suggerimenti

Chiamare MessageBoxA (una finestra di dialogo modale, bloccante) in un ciclo di ricezione è un'idea fondamentalmente errata. Se si desidera visualizzare i valori, eseguirlo in un debugger, stamparli in una finestra di dialogo (ad esempio un campo di testo), inviarli alla console o scaricarli in un file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top