문제

소켓을 사용하여 스트림 모드 인 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;
    }
}

이상한 점은. 원격 측면의 메시지 블록을 무책임하면 반발 순서가 반전됩니다. 따라서 원격 데이터의 결과는 올바른 순서가 아닙니다.

왜요? (그리고 각 조각의 올바른 순서를 어떻게 얻을 수 있습니까?)

미리 감사드립니다.

도움이 되었습니까?

해결책

Messageboba 함수가 실행되는 동안 메시지를 창으로 펌핑합니다. 당신의 스레드가 그들을 기대했는지 여부에 관계없이 Messageboba는 그들에게 당신에게 파견했습니다.

다른 팁

수신 루프에서 MessageBoxa (차단, 모달 대화 상자)를 호출하는 것은 근본적으로 결함이있는 아이디어입니다. 값을보고 싶다면 디버거로 실행하고 대화 상자 (예 : 텍스트 필드)로 인쇄하거나 콘솔에 출력하거나 파일에 덤프하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top