采用UDP方式接收和发送的包的最大长度是多少?

zoutaiqi 2002-11-25 04:21:40
采用UDP方式接收和发送的包的最大长度是多少?
为什么当包的大小大于2K时,接收方就接收不到?
...全文
1617 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
wavestudio 2002-12-09
  • 打赏
  • 举报
回复
我的意见:
1、系统在应用层为每一个socket都建立了一个接收缓冲区和一个发送换冲区,send、recv等操作实际上是在该缓冲区的一端操作,而系统内核在缓冲区的另一端进行操作,因此屏蔽了底层的mss和mtu的影响。
2、系统内核在传输层的收发要受到接口mtu的限制。其中tcp协议具有分段机制,根据mss的值计算每次发送和接收的数量,从而可以避免在ip层分片。而udp层则不这样做,因此常常在ip层导致分片。
win98ddk 2002-12-09
  • 打赏
  • 举报
回复
我自己写了一个TCP的图形传输模块,可以一次发送200KB的东西,但是也经常出现丢包的情况,即发送不完全,我的办法是采取3次检测重复发送的办法.大家看看有没有问题?
yanhuahui 2002-12-09
  • 打赏
  • 举报
回复
但是老是在重复一个话题,呵呵
yanhuahui 2002-12-09
  • 打赏
  • 举报
回复
我记得好像一个ip分片包是1500个字节?

ip分片的目的是因连路层的传输介质而引起的,我们一般是用以太网,以太网是

1500字节,所以你这个概念是不全的

我建议楼主结贴

感觉内容太乱了
wj59 2002-12-09
  • 打赏
  • 举报
回复
加上头和尾,每次RECEIVE时判断一下是否完整即可
ExitWin 2002-12-09
  • 打赏
  • 举报
回复
我记得好像一个ip分片包是1500个字节
cqjiang 2002-12-07
  • 打赏
  • 举报
回复
补充2:
1、UDP是比TCP低一层的协议。是不可靠的协议。
2、大量数据的广播UDP会严重阻塞网络。
3、建议你的程序改用TCP.不会增加编程难度和复杂度。
cqjiang 2002-12-07
  • 打赏
  • 举报
回复
补充:
1、不建议修改注册表,因为会失去通用性。
2、修改注册表有Win Api,查MSDN,很简单。
cqjiang 2002-12-07
  • 打赏
  • 举报
回复
UDP我用的少,一般是小量数据使用(<512byte),推荐使用最大512byte,因为512是标准,unix下也适用。

如果你用UDP传输大量数据,会严重阻塞网络。
如果你坚持要用UDP传大量数据,可以采用自己切分为<1460的包,一个个的发,通过你的通信规约实现,比如加一个包序号字节(当前m/共n帧)。接受方在重组。

下面是TCP的类似情况:
用TCP当发送一个〉1460byte的包时,系统要将包分成<=1460字节的包,如果你是严格的按 发、收配对时序,系统会自动为你还原重组包。不会漏,而且可以一次发送几兆的数据。

但以下情况你要自己处理(不严格按发收方式,即我文章里写的变种的Client/server)方式。

例:
server:发2000byte,再发100byte,(连续发两次,假设没有第三次发送)
client:第一次只收1460字节,第二次会收到(2000-1460+100)字节

结果是数据一个字节都不会漏,但是接受方第一次收到的是不完整的数据,第二次受到的又有多的数据。

这样理解最好,TCP就是全双工的,比如全双工的RSC232通信。

所以在你的通信规约里应加入自己通信帧的概念,当然也要有同步字用于断帧。

以上是我做实验的结果和结论,希望对你有所参考。

Chiun 2002-12-07
  • 打赏
  • 举报
回复
就cqjiang得所言,我想谈谈个人的一些看法:
(1)udp和tcp同属于传输层,因为是不可靠的协议,而把它说成是比TCP低一层的协议是不妥得。
(2)广播特性在TCP/IP 协议族内只有UDP具有,TCP无法取代。
zoutaiqi 2002-12-06
  • 打赏
  • 举报
回复
非常感谢cqjiang(蒋天书),困扰我多天的问题终于有些明朗了.
但是为什么有的朋友可以发送大于4K的包呢?除了修该注册表还有没有别的办法?在程序中应该如何修改注册表呢,给我一个方向,谢谢!
cqjiang 2002-12-06
  • 打赏
  • 举报
回复
1460字节,
microsoft的windows系列都是一个包1460byte.MSDN上写的

还有看我的文章
http://idoor.xiloo.com 《TCP/IP winsocket高级编程》
zoutaiqi 2002-12-06
  • 打赏
  • 举报
回复
我曾作过的尝试:
发送端:
long SendBufferSize = 1024000;
setsockopt(SendDataSocket, SOL_SOCKET, SO_SNDBUF,(char *)&SendBufferSize,sizeof(SendBufferSize));
接收端:
long RecvBufferSize = 1024000;
//设置接收端缓冲区为1024000
setsockopt(recvSocket, SOL_SOCKET, SO_RCVBUF,(char *)&RecvBufferSize,sizeof(RecvBufferSize))
long bufsize = 0;
int buflen = sizeof(bufsize);
//获取接收端缓冲区为1024000K,即以上设置成功
getsockopt(recvSocket, SOL_SOCKET, SO_RCVBUF,(char *)&bufsize,&buflen)
//获取最大的消息进入长度,结果为:bufsize = 65507
getsockopt(recvSocket, SOL_SOCKET, SO_MAX_MSG_SIZE,(char *)&bufsize,&buflen)

尝试所得的结果为:(是采用的UDP多播的方式!)
当所发数据包的长度小于1.5K时,没有错误发生.
当所发数据包的长度大于1.5K时,有错误发生.错误为:
在接收端的recvfrom()函数出错,错误代码为:10040.
10040错误解释(摘自:WINDOWS网络编程技术):消息过长.这个错误的含义很多.如果在一个数据报套接字上发送一条消息,这条消息对内部缓冲区而言太大的话,就会产生这个错误.再比如,由于网络本身的限制,使一条消息过长,也会产生这个错误.最后,如果收到数据报之后,缓冲区太小,不能接收消息时,也会产生这个错误.

网络本身应该没有什么问题,因为我试了别人写的一个程序,每次发送4K是没问题的,但那个程序并没有什么特别的设置啊!
jincai78 2002-11-30
  • 打赏
  • 举报
回复
我认为yanhuahui(眼发黑)的观点是正确的.
udp确实可是发送小于64k的数据,但据说小于8k时不容易丢包.

你在这里发送的是广播数据,当然和单独发送不太一样.
据msdn上说广播数据大于512byte不是很好.

在局部网中好象是可是发送大一点的数据包的.

ydfok 2002-11-29
  • 打赏
  • 举报
回复
gz,up
zoutaiqi 2002-11-29
  • 打赏
  • 举报
回复
我的系统是中文WINDOWS XP.
UDP缓冲我都设置的足够大了.
BugSpy 2002-11-29
  • 打赏
  • 举报
回复
发送 UDP包的大小与系统有关,
Win2k下<=64k
Win98下要小一些,具体数值不太清楚,不过最好不要超过2k
另外与UDP缓冲大小也有一定关系
ansonchen 2002-11-29
  • 打赏
  • 举报
回复
这和设的缓冲关系不大,换个环境试试吧
浮云 2002-11-29
  • 打赏
  • 举报
回复
gz
zoutaiqi 2002-11-28
  • 打赏
  • 举报
回复
谢谢各位,谢谢yanhuahui(眼发黑).让系统分片没问题,因分片导致丢包也没什么问题,我只是希望每次发送的包大一些(如10K)就行了,可否手工设置发送方和接受方接收的包的大小?
加载更多回复(28)

18,356

社区成员

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

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