Question

J'utilise socket pour envoyer des données d'une machine locale à une machine distante en mode flux, TCP. Le code dans la partie locale est:

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

La taille des données est d'environ 1 Mo. Par conséquent, socket peut les diviser en plusieurs paquets. Pendant que je reçois les données du côté distant, je dois les recevoir séparément, puis les combiner. Le code dans le côté distant est:

// ----------- 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 chose étrange est. Si je retire le commentaire du bloc de messages du côté distant, l'ordre de réception sera inversé. Ainsi, le résultat des données distantes n’est pas dans le bon ordre.

Pourquoi? (Et comment pourrais-je obtenir le bon ordre de chaque fragment?)

Merci d'avance.

Était-ce utile?

La solution

Pendant l'exécution de la fonction MessageBoxA, les messages sont transférés dans votre fenêtre. Que votre thread les attende ou non, MessageBoxA vous les a envoyées.

Autres conseils

L'appel de MessageBoxA (dialogue modal bloquant) dans une boucle de réception est une idée fondamentalement imparfaite. Si vous souhaitez voir les valeurs, exécutez-les dans un débogueur, imprimez-les dans une boîte de dialogue (un champ de texte, par exemple), exportez-les dans la console ou transférez-les dans un fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top