社区
网络编程
帖子详情
文件的分段传输
passenger728
2008-06-01 12:22:21
我做了一个关于文件传输的程序,但是只能传送几十兆以内的小型文件,我想通过文件分段传输实现大型文件的传输,希望大家帮帮忙!先谢了。
...全文
464
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协议建立连接,打开文件,做一个循环,每次读一小段数据,发送出去,再循环。
大
文件
分段
传输
与存储技术实现方案-
分段
传输
大
文件
处理存储优化数据分块断点续传并发处理
文件
校验分布式存储网络
传输
优化负载均衡-用于解决大
文件
上传下载过程中的网络不稳.zip
Makefile自动化编译实战项目大
文件
分段
传输
与存储技术实现方案_
分段
传输
大
文件
处理存储优化数据分块断点续传并发处理
文件
校验分布式存储网络
传输
优化负载均衡_用于解决大
文件
上传下载过程中的网络不稳.zip
Android笨重
文件
分段
传输
【源码免费下载链接】:https://renmaiwang.cn/s/xkbt5 在Android平台上,大
文件
的上传是一项挑战,因为考虑到网络稳定性、设备性能以及用户体验等因素。在标题"android大
文件
分段
上传"中提到的方法,是通过使用Socket流将大
文件
分段
进行上传,这是一种有效应对大
文件
传输
问题的策略。下面我们将详细探讨这一技术。了解Socket的基本概念。Socket是网络编程中的一个接口,它允许两个网络应用程序之间建立通信连接,进行数据交换。在Android中,我们可以使用java.net.Socket类来创建和管理Socket连接。
分段
上传的步骤通常包括以下几个关键环节:1. **
文件
分段
**:在上传前,我们需要将大
文件
分割成多个小块,每一块可以设定为一定的大小,如1MB或2MB。这可以通过Java的FileInputStream和FileChannel类实现,通过seek()和transferTo()方法读取并写入指定范围的
文件
内容。2. **建立Socket连接**:使用Socket创建与服务器的连接。需要指定服务器的IP地址和端口号,可以通过Socket的构造函数完成。同时,考虑到网络异常,需要做好异常处理和重试机制。3. **数据
传输
**:对每个
分段
进行上传。创建Socket的OutputStream,并利用它写入每个
文件
段的数据。可以使用DataOutputStream封装数据,以便添加必要的控制信息,如
文件
段的编号、总段数等。4. **服务器端接收**:服务器端也需要监听特定端口,接受Socket连接。当接收到数据后,根据控制信息将各段数据按顺序存储,并校验数据完整性。5. **断点续传**:为了应对网络中断或失败情况,可以实现断点续传功能。客户端保存已上传的
文件
段信息,当重新发起上传时,可以从已上传的最后一个段开始继续。6. **错误处理与确
android大
文件
分段
上传
android上利用socket流
分段
上传大
文件
C#socket 大
文件
传输
分段
传输
C#DEMO
C#socket 大
文件
传输
分段
传输
C#DEMO
前端
分段
传输
大
文件
组件,基于HTML5 File API、Blob,后端采用node接收
文件
.zip
html5开发
网络编程
18,358
社区成员
64,164
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章