Порядок получения сокета
Вопрос
Я использую сокет для отправки данных с локального компьютера на удаленный в TCP, потоковом режиме.Код на локальной стороне является :
// ----------- Local
send(sd, pData, iSize, 0); // send data
Размер данных составляет около 1 Мб, поэтому сокет может разделить их на несколько пакетов.Пока я получаю данные на удаленной стороне, я должен получать данные отдельно, а затем объединять их вместе.Код на удаленной стороне является :
// ----------- 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;
}
}
Странная вещь в том, что.Если я раскомментирую блок сообщений на удаленной стороне, порядок получения будет изменен на обратный.Таким образом, результат обработки удаленных данных находится в неправильном порядке.
Почему?(И как я мог бы получить правильный порядок каждого фрагмента?)
Заранее благодарю.
Решение
Во время выполнения функции MessageBoxA она перекачивает сообщения в ваше окно.Независимо от того, ожидал их ваш поток или нет, MessageBoxA отправил их вам.
Другие советы
Вызов MessageBoxA (блокирующего модального диалогового окна) в цикле приема - в корне ошибочная идея.Если вы хотите увидеть значения, запустите его в отладчике, распечатайте их в диалоговом окне (напримертекстовое поле), выведите их на консоль или сбросьте в файл.