Получение заказа розетки - PullRequest
       14

Получение заказа розетки

1 голос
/ 26 октября 2009

Я использую сокет для отправки данных с локального компьютера на удаленный в 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;
    }
}

Странная вещь. Если я раскомментирую блок сообщений на удаленной стороне, порядок получения будет отменен. Таким образом, результат удаленных данных не в правильном порядке.

Почему? (И как я могу получить правильный порядок каждого фрагмента?)

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 26 октября 2009

Во время выполнения функции MessageBoxA она отправляет сообщения в ваше окно. Независимо от того, ожидал ли ваш поток их, MessageBoxA отправил их вам.

0 голосов
/ 26 октября 2009

Вызов MessageBoxA (блокирующий модальный диалог) в цикле приема является принципиально ошибочной идеей. Если вы хотите просмотреть значения, запустите их в отладчике, распечатайте их в диалоговом окне (например, в текстовом поле), выведите на консоль или выведите в файл.

...