发送到的最大缓冲区长度?

问题描述 投票:0回答:3

如何获取可传递给作为 UDP 端口打开的套接字的

sendto(..)
调用的最大字节数?

sockets unix network-programming udp ioctl
3个回答
14
投票

使用 getsockopt()。 此网站对您可以检索的用法和选项进行了详细的细分。

在 Windows 中,您可以执行以下操作:

int optlen = sizeof(int);
int 优化;
getsockopt(socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *)&optval, &optlen);

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


5
投票

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

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

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


2
投票

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

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

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

奖金

UDP数据包的

SO_MAX_MSG_SIZE

  • IPv4:65,507 字节
  • IPv6:65,527 字节
© www.soinside.com 2019 - 2024. All rights reserved.