2009-10-26 45 views
1

我使用套接字將數據從本地機器發送到TCP,流模式下的遠程。 在本地端的代碼是:接收訂單的套接字

​​

數據的大小爲1MB左右,所以插座有可能將其劃分到幾個包。 雖然我在遠端接收數據,但我必須單獨收集數據,然後將它們組合在一起。 在遠程側的代碼是:

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

奇怪的是。如果我取消註釋遠端的消息塊,則接收順序將被顛倒。 因此,遠程數據的結果不正確。

爲什麼? (我怎麼能得到每個片段的正確順序?)

在此先感謝。

回答

1

MessageBoxA函數正在執行時,它會將消息泵送到您的窗口。無論你的線程是否期待他們,MessageBoxA都會將它們發送給你。

+0

「泵」是什麼意思? 你的意思是,每當我使用消息框時,所有的消息「已經發布到窗口的消息隊列中」都會被執行? 對不起,你能否清楚解釋一下。再次感謝。 – KenC 2009-10-26 05:35:18

+0

每個UI線程都有一個用於Windows消息的消息泵。如果您使用的是原始Win32 API,那麼您的winmain會調用GetMessage,DispatchMessage等,並且您擁有自己的WndProc。如果你使用的是MFC,那麼MFC庫的一部分就是爲你做的。無論哪種方式,無論您是否編碼,您的UI線程都有一個消息泵。 MSDN有很多頁面描述消息泵,並且它不適合這樣的評論。 – 2009-10-26 06:25:46

+0

你的意思是,如果我不使用消息框,那麼順序是正確的?因爲我嘗試了很多次。如果我不使用MessageBox,順序是沒問題的,儘管我有點擔心它。 – KenC 2009-10-26 09:21:04

0

在接收循環中調用MessageBoxA(阻塞,模態對話框)是一個根本上有缺陷的想法。如果您想查看這些值,請在調試器中運行它,將它們打印到對話框(例如文本字段),將它們輸出到控制檯或將它們轉儲到文件中。