MFC 소켓을 통한 파일전송 질문입니다.
조회수 2817회
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);
}
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력