关于文件传输的问题

Tony_me 2004-07-31 05:33:48
请教各位,我编了一个在客户端和服务器端使用TCP/IP协议的文件传输程序(socket),当传输大文件时候,接收端总不能接收完全就结束,接收的文件大小总是小于文件实际大小,请给出一些解决的建议,谢谢!
...全文
127 6 点赞 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
把文件分割成小块传输,到了接受段再合并。
  • 打赏
  • 举报
回复
将文件分块传输并写入磁盘缓存,可能是申请不到足够的内存。
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-07-31 05:33
社区公告

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