Pregunta

Estoy usando un socket para enviar datos desde la máquina local a la remota en TCP, modo de transmisión. El código en el lado local es:

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

El tamaño de los datos es de aproximadamente 1Mb, por lo que el socket podría dividirlo en varios paquetes. Mientras recibo los datos en el lado remoto, tengo que recibirlos por separado y luego combinarlos. El código en el lado remoto es:

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

Lo extraño es. Si descomento el bloque de mensajes en el lado remoto, el orden de recepción se revertirá. Por lo tanto, el resultado de los datos remotos no está en el orden correcto.

¿Por qué? (¿Y cómo podría obtener el orden correcto de cada fragmento?)

Gracias de antemano.

¿Fue útil?

Solución

Mientras se ejecuta la función MessageBoxA, bombea mensajes a su ventana. Ya sea que su hilo los esperara o no, MessageBoxA se los envió.

Otros consejos

Llamar a MessageBoxA (un diálogo modal de bloqueo) en un bucle de recepción es una idea fundamentalmente defectuosa. Si desea ver los valores, ejecútelos en un depurador, imprímalos en un cuadro de diálogo (por ejemplo, un campo de texto), envíelos a la consola o vuélvalos a un archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top