Ricezione dell'ordine del socket
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.
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.