MFC 소켓을 통한 파일전송 질문입니다.


MFC 소켓을 통한 파일전송에 도움이 필요합니다.

실시간으로 서버가 여러개의 클라이언트 화면을 볼 수 있는 프로그램을 제작하고있습니다.

기존에는 클라이언트에서 GetDesktopWindow() 를 통해서 얻은 화면캡쳐 화면을

memDC 에 넣는것 까진 했습니다 근데, 그 memDC를 소켓으로 서버에 보내는게 방법이

없어서 현재 ,

클라이언트는 현재 화면을 , 비트맵 형식 파일로 저장후 , 그 비트맵 파일(약 5MB)을 다시 바이너리 모드로 읽어와서 (CFILE 클래스이용) , send 함수를 통해 4096바이트씩 보내고,

서버에서는 send 함수가 호출될때 자동으로 receive 함수가 호출되어지기때문에, receive 함수에는 클라이언트가 send로보낸 4096바이트의데이터를 받아서 4096만큼의 동적배열에 저장하고, 그 데이터를 다시 CFILE::WRITE 를 통해 파일로 쓰는 작업을 하고있습니다.

근데 파일(총 5MB) 를 받아서 저장되어 만들어진 파일이 3KB 밖에 안되는데 도데체 어느부분에서 문제가 생긴건지 찾을수가 없습니다. 어떻게 해결해야 할까요 ?

소스코드는 아래에 첨부합니다.

/////////////////////////////////// 보내는 부분 /////////////////////

void CNetworkDlg::OnBnClickedButton2() { UpdateData(TRUE); if (m_iType == 1) { CFile sourceFile; // 파일변수 선언 MyFile clientfile; //클라이언트에서 보내는 파일정보를 저장할 구조체 변수 선언 sourceFile.Open(_T("buffbmp.bmp"), CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone); //파일변수를 통한 파일읽기, 바이너리타입

    int nSize = sourceFile.GetLength(); // 파일 전체사이즈 파악,.88800000
    DWORD dwRead; // 파일을 읽고 소켓으로 전송할거기때문에 선언
    byte* s_data = new byte[4096];

    while (0 < nSize) { //무한반복, nsize가 0이 아닐때 (파일이 끝이 아닐때 까지)
        int nTemp = nSize - 4096; // 88800000-4096=870000000
        //nTemp는 현재 남은 파일 사이즈를 말한다.
        // ntemp = bmp파일 사이즈 - 보낸 사이즈(4096)
        if (0 < nTemp) {// 복사할 데이터가 남아있다면
            sourceFile.Read(s_data, 4096); // 소스파일에서 4096만큼 메인구조체의 데이타에 넣는다
            nSize = nSize - 4096; // 전체받을크기에서 현재 받은크기만큼 빼고 파일크기에 저장
            dwRead=m_Csocket.Send(s_data, 4096); // 소켓으로 data를 현재 받은 데이터를 보낸다.

        }
        else { // 마지막 남은 데이터가 4096 이하일때 ! ㅇ여기서 지금 문제가 생긴다 ㄹㅇ ,;개빡치;네
            nTemp = 4096 + nTemp; //nTemp에 남은데이터 값이 들어간다 (4096이하의)
            sourceFile.Read(s_data, nTemp); // 소스파일에서 남은 데이터만큼 메인구조체의 데이타에 넣는다
            dwRead=m_Csocket.Send(s_data, nTemp); // 소켓으로 data를 현재 받은 데이터를 보낸다.
            break;

            MessageBox(_T("데이터4096이하!"));
            CString strer3rer;
            strer3rer.Format(_T("%lu", dwRead));
            MessageBox(strer3rer);
        }   
        ::Sleep(10);
    }
    MessageBox(_T("파일전송완료"));
    delete clientfile.data; // 메인구조체 내에 동적선언 해줬던 데이터 배열을 반환한다.
    sourceFile.Close(); // 소스파일을 닫는다 
}
UpdateData(FALSE);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

}

//////////////////받는부분/////////////////////////

void CNetworkDlg::OnReceive() // 상대방이 데이터를 보냈을때 내가 데이터를 //사용할 방향(send호출시 자동으로 열림) { UpdateData(TRUE); if (m_iType == 0) { // 서버일때 MyFile serverfile; // 서버파일 크기와 데이터를 담을구조체 선언 CFile receiveFile; // 파일 객체선언 byte *r_data = new byte[4096]; DWORD dwRecv; int nTemp; receiveFile.Open(_T("reiceve.bmp"), CFile::modeCreate | CFile::modeWrite |CFile::typeBinary); //파일열기

    dwRecv = m_Csocket.Receive(r_data, 4096);  // r_data 배열에 4096만큼의 데이터를 받고, 받았다는 반환값은 dwRecv 이다.


    if(dwRecv<4096) { // 받은 파일이 4096이하일때.( 마지막 한번일때)
        receiveFile.Write(&r_data, dwRecv); // 읽어온 바이트 수(dwrecv) 만큼 파일에 출력한다
        MessageBox(_T("파일전송완료!"));
    }
    else {
        receiveFile.Write(&r_data, 4096); // 읽어온 바이트 수(dwrecv) 만큼 파일에 출력한다
    }





    delete r_data; // 메인구조체 내에 동적선언 해줬던 데이터 배열을 반환한다.
    receiveFile.Close(); // 소스파일을 닫는다 

}
UpdateData(FALSE);

}

  • 2017년 12월 01일에 작성됨

조회수 103


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close