sendto的最大缓冲区长度?

Posted

技术标签:

【中文标题】sendto的最大缓冲区长度?【英文标题】:Maximum buffer length for sendto? 【发布时间】:2010-09-06 18:03:17 【问题描述】:

对于作为 UDP 端口打开的套接字,您如何获得可以传递给 sendto(..) 调用的最大字节数?

【问题讨论】:

【参考方案1】:

使用getsockopt()。 This site 很好地细分了您可以检索的用法和选项。

在 Windows 中,您可以:

int optlen = sizeof(int); 整数选择值; getsockopt(socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *)&optval, &optlen);

对于 Linux,根据 UDP 手册页,内核将使用 MTU 发现(它将检查此处和目的地之间的最大 UDP 数据包大小,并选择它),或者如果 MTU 发现关闭,它'将最大大小设置为接口 MTU 并分段任何更大的内容。如果您通过以太网发送,典型的 MTU 为 1500 字节。

【讨论】:

【参考方案2】:

在 Mac OS X 上,发送 (SO_SNDBUF) 和接收 (SO_RCVBUF) 的值不同。 这是发送缓冲区的大小(man getsockopt):

getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (int *)&optval, &optlen);

尝试发送更大的消息(在通过本地环回发送的 UDP 上的 Leopard 9216 八位字节)将导致“消息太长/EMSGSIZE”。

【讨论】:

【参考方案3】:

由于 UDP 不是面向连接的,因此无法指示两个数据包属于一起。因此,您会受到单个 IP 数据包的最大大小 (65535) 的限制。您可以发送的数据要少一些,因为 IP 数据包大小还包括 IP 标头(通常为 20 个字节)和 UDP 标头(8 个字节)。

请注意,此 IP 数据包可以分段以适合较小的数据包(例如,以太网约 1500 字节)。

我不知道有任何操作系统会进一步限制这一点。

奖金

SO_MAX_MSG_SIZE的UDP数据包

IPv4:65,507 字节 IPv6:65,527 字节

【讨论】:

以上是关于sendto的最大缓冲区长度?的主要内容,如果未能解决你的问题,请参考以下文章

手把手写C++服务器(24):socket响应一般框架TCP修改缓冲区内核监听listen最大长度

unix udp sendto 最大可发送的数据长度

UDP Socket.SendTo是否可以执行不完整的发送?

udp Socket 发送缓冲区 最大可以为多大

udp Socket 发送缓冲区 最大可以为多大

根据缓冲区长度将空终止字符数组复制到 std::string