据说UDP协议,每个数据包有个最大值,叫SO_MAX_MSG_SIZE,请问这个值对于每个机器都是一样的吗?

screen12 2016-04-22 09:14:59
有进行UDP传输的时候,每个UDP数据包,都有一个最大值的限制,叫做SO_MAX_MSG_SIZE。

请问,这个值对于所有机器都一样?还是各个机器不同?怎样查看服务器上的这个值是多少?
...全文
518 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
screen12 2016-04-22
  • 打赏
  • 举报
回复
引用 1 楼 kinkon007 的回复:
这个是整包的大小,一般是64K,在下层传输的时候会按照系统的MTU进行IP包的分片,其实对每个UDP包来讲也就存在分片还是不分片的情况,这个数值在包里是没有体现的。
可我的VS2008,我看了一个里面的定义,是这样的: #define SO_MAX_MSG_SIZE 0x2003 /* maximum message size */ 从这个数值上看,没有64K啊!自己能修改它吗?在VS2008里修改就能起作用了?
screen12 2016-04-22
  • 打赏
  • 举报
回复
引用 1 楼 kinkon007 的回复:
这个是整包的大小,一般是64K,在下层传输的时候会按照系统的MTU进行IP包的分片,其实对每个UDP包来讲也就存在分片还是不分片的情况,这个数值在包里是没有体现的。
我听说,UDP协议,数据传输时,是有边界的,一个包就是一个包,不能出现数据在粘连。sendto一发就是一个整包,revcfrom一收就是一个整包,只要本机缓冲区够大,都是收完再返回的。 那就是说,如果数据包的大小,不超过发送端的SO_MAX_MSG_SIZE,出不超过接收端的 SO_MAX_MSG_SIZE。就没有问题是吗?接收端的recvfrom会收到一个完整的数据才返回,是吗?
kinkon007 2016-04-22
  • 打赏
  • 举报
回复
getsockopt(s, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&iVal, &iSize);
kinkon007 2016-04-22
  • 打赏
  • 举报
回复
这个是整包的大小,一般是64K,在下层传输的时候会按照系统的MTU进行IP包的分片,其实对每个UDP包来讲也就存在分片还是不分片的情况,这个数值在包里是没有体现的。
赵4老师 2016-04-22
  • 打赏
  • 举报
回复
《TCP-IP详解》
kinkon007 2016-04-22
  • 打赏
  • 举报
回复
引用 3 楼 screen12 的回复:
[quote=引用 1 楼 kinkon007 的回复:] 这个是整包的大小,一般是64K,在下层传输的时候会按照系统的MTU进行IP包的分片,其实对每个UDP包来讲也就存在分片还是不分片的情况,这个数值在包里是没有体现的。
我听说,UDP协议,数据传输时,是有边界的,一个包就是一个包,不能出现数据在粘连。sendto一发就是一个整包,revcfrom一收就是一个整包,只要本机缓冲区够大,都是收完再返回的。 那就是说,如果数据包的大小,不超过发送端的SO_MAX_MSG_SIZE,出不超过接收端的 SO_MAX_MSG_SIZE。就没有问题是吗?接收端的recvfrom会收到一个完整的数据才返回,是吗?[/quote] 是的
kinkon007 2016-04-22
  • 打赏
  • 举报
回复
引用 4 楼 screen12 的回复:
[quote=引用 1 楼 kinkon007 的回复:] 这个是整包的大小,一般是64K,在下层传输的时候会按照系统的MTU进行IP包的分片,其实对每个UDP包来讲也就存在分片还是不分片的情况,这个数值在包里是没有体现的。
可我的VS2008,我看了一个里面的定义,是这样的: #define SO_MAX_MSG_SIZE 0x2003 /* maximum message size */ 从这个数值上看,没有64K啊!自己能修改它吗?在VS2008里修改就能起作用了? [/quote] 这个64K是最大值,0x2003并没有超过

18,363

社区成员

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

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