views:

117

answers:

2

Hi,

I am using socket to send data from local machine to remote in TCP, stream mode. The code in the local side is :

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

The size of the data is about 1Mb, so socket might divide it to several packets. While I am recieving the data on remote side, I have to recieve the data separately, and then combine them together. The code in the remote side is :

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

The odd thing is. If I uncomment the message block on remote side, the recieving order will be reversed. Thus, the result of the remote data is not in a correct order.

Why? (And how could I get the correct order of each fragment?)

Thanks in advance.

+1  A: 

While the MessageBoxA function is executing, it pumps messages to your window. Whether or not your thread was expecting them, MessageBoxA dispatched them to you.

Windows programmer
What does "pump" means?Do you mean, every time I use a message box, all the message "has already posted to the window's message queue" will be executed?Sorry, could you explain it clearly. Thanks again.
KenC
Each UI thread has a message pump for Windows messages. If you're using raw Win32 APIs then your winmain calls GetMessage, DispatchMessage, etc. and you have your own WndProc. If you're using MFC then part of the MFC library does this for you. Either way, whether you coded it or not, your UI thread has a message pump. MSDN has many pages describing message pumps and it won't fit in a comment like this.
Windows programmer
You mean, if I don't use message box in it, the order would be correct? Cause I tried a lot of times. If I don't use MessageBox, the order is alright, although I kinda worry about it.
KenC
You last comment answers its own question.
Stuart
A: 

Calling MessageBoxA (a blocking, modal dialog) in a receive loop is a fundamentally flawed idea. If you want to see the values, run it in a debugger, print them to a dialog (e.g. a text field), output them to the console or dump them to a file.

Stuart