关于文件传输的问题

Tony_me 2004-07-31 05:33:48
请教各位,我编了一个在客户端和服务器端使用TCP/IP协议的文件传输程序(socket),当传输大文件时候,接收端总不能接收完全就结束,接收的文件大小总是小于文件实际大小,请给出一些解决的建议,谢谢!
...全文
158 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tghost333 2004-08-02
  • 打赏
  • 举报
回复
学习
cpmax 2004-08-01
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=639
看一下这个例子,可以满足你的要求了!!!
mingbao 2004-07-31
  • 打赏
  • 举报
回复
估计是逻辑控制问题.
我也写过用TCP/IP协议传输文件的程序,没有遇到过这种情况.
你应该用二进制流的方式打开文件,并且准确地获得文件的大小,按字节为单位传输.
接收的时候也要准确地对字节进行计数.
另外,如果文件太大,你应该保证你的整形变量能够存储表示文件大小的整数.
howtotell 2004-07-31
  • 打赏
  • 举报
回复
你在传送数据之前首先要把文件信息传送过去,根据文件信息建立文件,确定循环的次数:
/*
函数:向客户机传输指定的文件:不支持断点续传
*/
void CTransfer::Transfer(CString m_ip,CString m_path)
{
CSocket soc1;
soc1.Create();

if(!soc1.Connect(m_ip,553))
{
soc1.Close();
return;
}

WIN32_FIND_DATA fd;
memset(&fd,0,sizeof(fd));
FindClose(FindFirstFile(m_path,&fd));
soc1.Send(&fd,sizeof(WIN32_FIND_DATA));

CFile myFile;
if(!myFile.Open(m_path, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone))
{
myFile.Close();
return ;
}

DWORD dwRead=0;
BYTE* data;
while(dwRead<fd.nFileSizeLow)
{
data = new BYTE[2048];
UINT dw=myFile.Read(data,2048);
soc1.Send(data, dw);
dwRead+=dw;
delete [] data;
}
myFile.Close();
soc1.Close();

char FName[MAX_PATH];
::_splitpath(m_path,NULL,NULL,FName,NULL);
if(strcmp(FName,"temp")==0||
strcmp(FName,"file")==0||
strcmp(FName,"reg")==0||
strcmp(FName,"ie.txt")==0)
{
::DeleteFile(m_path);
}
}

/*
函数:接收客户机传送过来的文件并存入制定路径
*/
BOOL CTransfer::DataReceive(CString m_ip, CString m_SDir)
{

CSocket soc;
soc.Create();

soc.Connect(m_ip,553);

WIN32_FIND_DATA FindFileData;
soc.Receive(&FindFileData,sizeof(WIN32_FIND_DATA));

CFile myFile;
if(!myFile.Open(m_SDir, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
{
myFile.Close();
return FALSE;
}

DWORD dwRead=0;
BYTE* data;
while(dwRead<FindFileData.nFileSizeLow)
{
data = new BYTE[2048];
UINT dw=soc.Receive(data, 2048);
myFile.Write(data,dw);
dwRead+=dw;
delete [] data;
}

myFile.Close();
soc.Close();

return TRUE;
}
Kudeet 2004-07-31
  • 打赏
  • 举报
回复
把文件分割成小块传输,到了接受段再合并。
薛定谔之死猫 2004-07-31
  • 打赏
  • 举报
回复
将文件分块传输并写入磁盘缓存,可能是申请不到足够的内存。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧