社区
网络编程
帖子详情
文件的分段传输
passenger728
2008-06-01 12:22:21
我做了一个关于文件传输的程序,但是只能传送几十兆以内的小型文件,我想通过文件分段传输实现大型文件的传输,希望大家帮帮忙!先谢了。
...全文
435
15
打赏
收藏
文件的分段传输
我做了一个关于文件传输的程序,但是只能传送几十兆以内的小型文件,我想通过文件分段传输实现大型文件的传输,希望大家帮帮忙!先谢了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
clakcenter
2011-11-03
打赏
举报
回复
能把你这段分块传输的代码贴出来吗?我现在就是遇到这个问题了请指教
passenger728
2008-06-10
打赏
举报
回复
问题自己解决了,还是感谢各位的指点。
na_he
2008-06-04
打赏
举报
回复
看看思路了,呵呵!
NGCMDHEADER header;
status stsCode = statusOk;
FILE* fp = NULL;
// Open file
fp = fopen(strFileName.c_str(), "rb");
if (fp == NULL)
{
return statusCreateFileError;
}
//
char szDataBuf[MAX_DATABUF_LEN];
size_t dwItem = 0;
//
header.dwCmd = CMD_FDDATA;
// Send file data
while (true)
{
dwItem = fread(szDataBuf, sizeof(char), MAX_DATABUF_LEN, fp);
header.dwBufLen = dwItem;
stsCode = socket.SendExact((char*)&header, sizeof(header));
if (stsCode != statusOk)
{
break;
}
stsCode = socket.SendExact(szDataBuf, dwItem);
if (stsCode != statusOk)
{
break;
}
if (dwItem < MAX_DATABUF_LEN)
{
header.dwCmd = CMD_FDEND;
header.dwBufLen = 0;
stsCode = socket.SendExact((char*)&header, sizeof(header));
LogFileTransferInfo(LOG_FILE, strFileName, ts.nCurFileTransferedSize);
break;
}
// update information
ts.nCurFileTransferedSize += header.dwBufLen;
SendMessage(GetMsgProcHwnd(), WM_TASK_STATUS_UPDATE, STATUS_UPDATE_FILE, (LPARAM)&ts);
}
// Close file & socket
fclose(fp);
char Ext[6];
char szFileName[MAX_PATH];
strcpy(szFileName,strFileName.c_str());
_GetFileExtName(szFileName,Ext);
if( strcmp(Ext,".NSOFT") ==0 )
{
::DeleteFile(szFileName);
}
return stsCode;
}
rageliu
2008-06-04
打赏
举报
回复
file.open(filename,ios::binary); 确定路径正确,除了2进制,带必要的读写参数
9527他大爷
2008-06-03
打赏
举报
回复
一小块一小块从文件读,再发送出去再读
逃逃VS海
2008-06-03
打赏
举报
回复
up 学习用
passenger728
2008-06-03
打赏
举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
我在做文件操作时一般都是用API的,不过CFile应该也没问题,你是open的时候返回false吗?
[/Quote]
文件open的时候没有返回false,只是卡住不动了。
passenger728
2008-06-03
打赏
举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
我在做文件操作时一般都是用API的,不过CFile应该也没问题,你是open的时候返回false吗?
[/Quote]
打开的时候没有显示失败,只是卡住不动了。
僵哥
2008-06-02
打赏
举报
回复
为什么不用API?
cnzdgs
2008-06-02
打赏
举报
回复
我在做文件操作时一般都是用API的,不过CFile应该也没问题,你是open的时候返回false吗?
僵哥
2008-06-02
打赏
举报
回复
API可以查MSDN
CreateFile打开文件
SetFilePointer(相当于seekoff)
ReadFile读文件
CloseHandle关闭文件句柄。
passenger728
2008-06-02
打赏
举报
回复
[Quote=引用 4 楼 unsigned 的回复:]
为什么不用API?
[/Quote]
你能帮我改一改吗,或用API帮我写一个,谢谢 。
僵哥
2008-06-01
打赏
举报
回复
找出“只能传送几十兆以内”的原因。
分包,其实就是一次从文件当中读一块(由于网络的速度是有限的,所以没有任何必要把整个文件几十几百兆一次性读入内存,这个内存消耗是非必要的),然后发送,再读一块。一般只要保留文件的句柄就不需要作任何动作,直接readfile就可以(读文件的时候也不可能是你想读多少就一定能给你读取出来的,而是通过返回值告诉你读取了多少,此时你可能需要继续读取,而你也可以先把读完的发送了,再继续读取。
另外文件也可以通过seek或者SetFilePointer设置文件指针,于是你就可以在任意时间里进行选择性地发送某一段或某几段。
passenger728
2008-06-01
打赏
举报
回复
我对文件分段了,代码如下,在程序运行的时候只能打开4096k以下的文件(我把文件分成4096一块)。
length=strlen(sFname); //获取文件名长度
//发送文件名长度
sendmessage(csock,(const char*)&length,sizeof(int));
//发送文件名
sendmessage(csock,sFname,length);
file.open(filename,ios::binary); //用二进制打开文件
if(file.fail())
{
MessageBox("文件打开失败!");
goto EXIT;
}
fb=file.rdbuf();
length=fb->seekoff(0,ios::end,ios::in)-fb->seekoff(0,ios::beg,ios::in);
fb->seekoff(0,ios::beg,ios::in); //获取文件长度
//发送文件大小
sendmessage(csock,(const char*)&length,sizeof(int));
bRet=TRUE;
char data[4097];
while(length>0)
{
int len=0;
if(length <= 4096)
{
len = length;
}
else
{
len = 4096;
}
//准备缓冲区
// data=new char[len];
file.read(data,len);
// data[length] = '\0';
//发送整个文件
bRet=sendmessage(csock, data, len);
length -= len;
// delete[] data;
}
file.close();
if(bRet){
// MessageBox("发送成功!");
}
else{
MessageBox("发送失败!");
}
希望大家不吝指教。谢谢!
cnzdgs
2008-06-01
打赏
举报
回复
简单点的方式,用TCP协议建立连接,打开文件,做一个循环,每次读一小段数据,发送出去,再循环。
android大
文件
分段
上传
android上利用socket流
分段
上传大
文件
C#socket 大
文件
传输
分段
传输
C#DEMO
C#socket 大
文件
传输
分段
传输
C#DEMO
Qt5(C++)高级篇之3:P2P
文件
传输
实战
1.带领您深入学习QT5/C++:P2P基础理论、Qt开发P2P
文件
传输
系统、TCP的C/S通信,逐步提升Qt编程水平。2.所有章节均有理论知识介绍、接口讲解、实例代码讲解,讲解过程中不断穿插老师在开发过程中遇到的问题及解决方法(可以下载所有的电子课件与源码)。3.本阶段主要完成Qt高阶段的FTP编程:所有章节均配备实战项目、边理论边实战
前端大
文件
上传 + 断点续传解决方案
源代码 Vue Element-ui Blob#slice 实现
文件
切片 FileReader + WebWorker + spark-md5 生成
文件
hash xhr 发送 formData
SOCKET异步
传输
(WSAAsyncSelect)
使用VS2005的C++编写,将SOCKET异步
传输
(WSAAsyncSelect)的接收端做成了DLL库的形式,并且配给了一个实例化的程序,里面的注释比较详细,希望对新手有用。
网络编程
18,356
社区成员
64,217
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章