【问题标题】:how to send UDP datagram larger than system buffer?如何发送大于系统缓冲区的UDP数据报?
【发布时间】:2012-08-09 10:23:59
【问题描述】:

这里的任何人都可以告诉我如何发送大于提供给 UDP 套接字的系统缓冲区的数据报,以便在 C 中测试 MSG_TRANC

以及如何获取套接字缓冲区的大小?

【问题讨论】:

  • 您不能发送大于套接字缓冲区的 UDP 数据包。 (内核没有空间,send() 会因 EMSGSIZE 出错)您无法接收大于套接字缓冲区的数据报。 (内核没有空间容纳它,并且会丢弃数据包)。
  • 但是有一个标志告诉你消息被截断了
  • 是的。也就是说,如果您尝试将数据包读入应用程序中的 your 缓冲区,但 your 缓冲区不够大。例如有人给你发了一个 1000 字节的数据包,你给 recvmsg() 一个大小为 500 的缓冲区,将设置 MSG_TRUNC 标志,前 500 个字节被复制到你的缓冲区,其他 500 个字节被丢弃。这里有很多层在起作用。网卡 -> 驱动环缓冲区 -> 内核套接字缓冲区 -> 你的应用程序

标签: c sockets udp buffer


【解决方案1】:

您始终可以通过 setsockopt 函数使用 SO_SNDBUF 标志来增加缓冲区大小。

否则send(或sendto)会正常阻塞。

但是,我建议您尝试重新设计您的协议,以便数据包适合发送缓冲区。您可以在收到包裹后重新组装(如果您对它们进行了适当的排序)。

【讨论】:

  • UDP send(2) 不会阻塞大于SO_SNDBUF 的消息,它会与EMSGSIZE 出错。
【解决方案2】:

你的意思或想要做什么?
我希望你阅读http://en.wikipedia.org/wiki/User_Datagram_Protocol

您是否尝试发送总长度大于单个数据包大小的数据报?还是您用于构建数据包的发送缓冲区太小?

【讨论】:

  • 我想测试与 UDP 套接字关联的 MSG_TRUNC,所以我必须增加发送端的缓冲区大小,以便 MSG_TRUNC 标志起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
相关资源
最近更新 更多