سؤال

وأنا باستخدام مقبس لإرسال البيانات من الجهاز المحلي إلى البعيد في TCP، ووضع تيار. التعليمات البرمجية في الجانب المحلي:

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

وحجم البيانات حول 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;
    }
}

والشيء الغريب هو. إذا كنت غير تعليق كتلة رسالة على الجانب البعيد، سيتم عكس ترتيب يستلم. وهكذا، فإن نتيجة للبيانات عن بعد ليست في الترتيب الصحيح.

لماذا؟ (وكيف يمكن أن أحصل على الترتيب الصحيح من كل جزء؟)

وشكرا مقدما.

هل كانت مفيدة؟

المحلول

وعلى الرغم من أن وظيفة MessageBoxA المنفذة، ومضخات رسائل إلى الإطار الخاص بك. أم لا والخيط الخاص بك يتوقعون منهم، أرسلت MessageBoxA لهم لكم.

نصائح أخرى

ودعوة MessageBoxA (أ حظر، حوار مشروط) في تلقي حلقة هي فكرة خاطئة من أساسها. إذا كنت تريد أن ترى القيم وتشغيله في مصحح، طباعتها إلى الحوار (مثل حقل النص)، خرج منها إلى وحدة التحكم أو رميها إلى ملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top