sendto的最大缓冲区长度?

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

使用getsockopt()。 这个网站有很好的使用情况和你可以检索的选项。

在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字节。

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

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

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

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

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

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