udp socket来传输大文件问题

cansanta 2005-06-08 10:29:56
我想用udp socket来传输大文件(大于64k),因为一个udp包的最大数据长度是64k.请问我需不需要再传输的时候,将文件分成64k一下的包,然后再接收端组包?有人说不用,socket会自动的将大于64k文件分成几个udp包,接收端自动的将几个udp包组成一个文件.请问请问我需不需要再传输的时候,将文件分成64k一下的包,然后再接收端组包?
...全文
389 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sct 2005-09-06
  • 打赏
  • 举报
回复
xuexi
Sander 2005-06-13
  • 打赏
  • 举报
回复
首先解决,packet size的问题,
然后考虑用UDP实现可靠文件传输
http://hackangel.go1.icpcn.com/lilisoft/UDPTrsmtFile.rar
这个是个例子
cansanta 2005-06-12
  • 打赏
  • 举报
回复
谢谢各位的回答。程序的通讯因为涉及和其他人的接口,现在他们都是用udp实现的。所以最好用udp实现。我和其他模块之间是在局域网中通讯,只要文件传输中包的丢失率不高,文件是可以丢失的。由于本人对socket通讯不太熟。请大家根据我的提示再帮我。考虑考虑。
Sander 2005-06-09
  • 打赏
  • 举报
回复
理论上你可以不组包,但是这个肯定不行。
因为udp是不可靠的协议, 接收的时候,是按包接收,而这个包,是driver 发的包,
如果你发的包大于driver 的buffer, 那它会自动分包,如果你 有一个收不到,你就不知道是那个了。
特别是在internet 的状况下 ,丢包机会会更大
fisker0303 2005-06-09
  • 打赏
  • 举报
回复
udp是不可靠的协议,64K显然要自己分包了,并要采用适当的组包算法,可以参考TCP的实现。

简单的说,最好1个包1K或0.5K,发包过程可以如下:
typedef struct _Data
{
int iType; // 包的消息类型
int iNum; // 包的编号
char* caData; // 实际发送的数据
}DATA;

发包的时候,指定一种数据类型,如:0;
依次把包分成64份,并发出;
发送完后,可以用另一种消息类型,如:1来标志包已全部发完;
接收端根据编号组包;
如果有丢包,通知发送放重新发送;
循环上述过程... ...
xxrl 2005-06-09
  • 打赏
  • 举报
回复
在www.vckbase.com里面搜索一下 我下载了 但在家里面电脑里 公司里面没有
new_guy 2005-06-09
  • 打赏
  • 举报
回复
帮你顶。
应该看你用什么层次的编程接口吧。
记得《windows网络编程》里面 是要自己分的。
大概的算法是这样:
#dedinf MAXBUF 4000

char buf[MAXBUF];
//fill buffer with nlen byte
while(nlen>0){
int n =send(buf,sock.....);
nlen-=n;
buf+=nlen;
}
younggle 2005-06-09
  • 打赏
  • 举报
回复
一般来说,文件的传输是需要可靠的传输的,因为文件中少了1个字节都是不行的。所以建议你使用TCP传输,而不要使用UDP进行传输。并且使用TCP比UDP方便一些(从写程序的角度来说)。
不过如果你的UDP传输也是可靠的(需要自己实现),那也可以使用UDP。但是麻烦一些。
nuaawenlin 2005-06-09
  • 打赏
  • 举报
回复
加上数据头,数据尾和校验和

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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