【问题标题】:How to dynamically allocate buffer for receiving UDP socket (VB.Net)如何动态分配缓冲区以接收 UDP 套接字(VB.Net)
【发布时间】:2014-10-13 14:34:44
【问题描述】:

我和一个朋友正在做一个项目,我们需要使用 VB.Net 构建一个可靠的 UDP 客户端/服务器。我们的事情运行良好,但我们仍然无法解决的一件事是如何为传入的数据动态分配一个(字节)缓冲区。现在我们必须硬编码一个最大值/MTU(或者使用一个非常大的缓冲区大小并在我们完成接收后调整它的大小)。有谁知道无需指定接收缓冲区大小即可完成此操作的方法?

基本上,在使用大小为 x 的缓冲区调用套接字上的接收函数之前,我们想知道 x,以便我们可以分配适当大小的缓冲区。也许这是您必须处理的所有套接字编程中的一个问题??

【问题讨论】:

  • 你好。你能更清楚地说明你在说什么缓冲区吗?我相信 Windows 核心,操作系统本身为 UDP 维护一个缓冲区。如果你使用 Socket.ReceiveFrom,它会从你那里接受一个字节数组(另一个缓冲区)来放入数据。你说的是哪个缓冲区?我可以知道吗?

标签: vb.net sockets udp buffer


【解决方案1】:

这是您在使用 UDP 时必须承担的负担之一。你必须考虑Path MTU discovery。再说一次,由于您正在制作可靠的 UDP,您应该能够自动检测到这一点并动态切换到更小的数据包大小。这也将解决 PMTUD 问题。

希望这听起来不太像:“那些不使用 TCP 的人注定要重新发明它。”查看该文章中链接的 RFC 以获取想法。

【讨论】:

  • 感谢您的回答。我已经阅读了路径 MTU 发现 RFC,这是我们将来可能会考虑实施的内容。我们可以使用 Socket 设置的最大数据包大小,看起来是 8k。如果 TCP 是一个选项,我们肯定会使用它,但你真的学会尊重最初构建这些协议的人(当你尝试自己重建它们时)
猜你喜欢
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2018-11-08
  • 2012-07-12
相关资源
最近更新 更多