ㅠㅠ 다시 질문 올립니다.. ㅠ
수신 쪽에서 파일 요청 하면 송신쪽에서 파일 보내는 거 짜고 있습니다
송신쪽 입니다.
...(생략)
case WM_SEVENT :
SEvent(wParam, lParam);
...(생략)
WSAAsyncSelect(s, hClient, WM_SEVENT, FD_READ | FD_WRITE | FD_CLOSE);
...(생략)
void SEvent(WPARAM wParam, LPARAM lParam)
{
switch(WSAGETSELECTEVENT(lParam)){
case FD_READ :
Read();
break;
...(생략)
void Read()
{
...(생략)
hThread = CreateThread(NULL, 0, SendFile, NULL, 0, NULL);
...(생략)
}
DWORD WINAPI SendFile(LPVOID arg)
{
...(생략)
if((pfile=fopen(FilePath,"rb"))==NULL)
{
MessageBox(hClient,"전송할 파일열기 에러",0,0);
return 1;
}
if((send(s,FileName,256,0)==SOCKET_ERROR))
{
MessageBox(hClient,"파일 이름전송 에러",0,0);
}
fseek(pfile,0,SEEK_END);
TotalSize=ftell(pfile);
rewind(pfile);
if((send(s,(char*)&TotalSize,sizeof(TotalSize),0)==SOCKET_ERROR))
{
MessageBox(hClient,"파일 크기 전송 에러",0,0);
return 1;
}
while(1)
{
FileSize=fread(buf,1,4096,pfile);
if(FileSize>0)
{
sentSize=send(s,buf+sentSize,FileSize-sentSize,0);
if(sentSize==SOCKET_ERROR)
{
MessageBox(hClient,"데이터 전송 에러",0,0);
break;
}
TotalFileSize += FileSize;
}
else if(FileSize == 0 && TotalFileSize == TotalSize) break;
}
fclose(pfile);
}
수신쪽
...(생략)
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ :
WSAAsyncSelect(MessageSocket, m_hWnd, WM_CEVENT,FD_CLOSE);
if((recv(MessageSocket,FileName,256,0)==SOCKET_ERROR))//파일 이름 받는부분
{
MessageBox(FileName);
MessageBox("파일 이름 받기 에러");
break;
}
sprintf(path,"d:\\%s%s",inet_ntoa(addr.sin_addr),FileName);
if((recv(MessageSocket,(char*)&FileSize,sizeof(FileSize),0)==SOCKET_ERROR)) //파일 크기 받는 부분
{
MessageBox("파일 크기 받기 에러");
break;
}
pfile=fopen(path,"wb");//파일 여는 부분
if(pfile==NULL)
{
MessageBox("파일 열기 에러");
break;
}
while(TotalRecvSize<=FileSize)
{
RecvSize=(recv(MessageSocket,buffer+RecvSize,4096-RecvSize,0));
if(RecvSize==SOCKET_ERROR)
{
MessageBox("파일 데이터 받기 에러");
break;
}
else
{
fwrite(buffer,1,RecvSize,pfile);
if(ferror(pfile))
{
MessageBox("파일 입출력 에러");
break;
}
TotalRecvSize+=RecvSize;
}
}
fclose(pfile);
if(FileSize==TotalRecvSize)
{
MessageBox("파일 수신 성공");
}
else
{
MessageBox("파일 수신 실패");
}
WSAAsyncSelect(MessageSocket, m_hWnd, WM_CEVENT,FD_READ | FD_CLOSE);
break;
24KB까지 밖에 안받아지네요 ㅠㅠㅠ
한번에 보내는 랜덤이라고 만큼 받도록 계속 루프 돌려야 된다는데
while(TotalRecvSize<=FileSize) 부분이 그 부분이 아닌가요?ㅠㅠ
댓글 달기