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

rdrgkggo  于 11个月前  发布在  Unix
关注(0)|答案(3)|浏览(209)

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

o2gm4chl

o2gm4chl1#

This site有一个很好的用法分类和可以检索的选项。
在Windows中,您可以:

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

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

mkshixfv

mkshixfv2#

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

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

字符串
尝试发送更大的消息(通过本地UDP发送的UDP上的Leopard 9216八位字节)将导致“Message too long / EMSGSIZE”。

xv8emn3q

xv8emn3q3#

由于UDP不是面向连接的,因此无法表示两个数据包属于一起。因此,您受到单个IP数据包的最大大小(65535)的限制。您可以发送的数据略小于该值,因为IP数据包大小还包括IP报头(通常为20字节)和UDP报头(8字节)。
请注意,这个IP数据包可以被分割成更小的数据包(例如,以太网的约1500字节)。
我不知道任何操作系统进一步限制这一点。

奖励

SO_MAX_MSG_SIZE个UDP数据包

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

相关问题