sendto的最大缓冲区长度是多少?

时间:2008-08-25 10:27:55

标签: unix sockets networking udp ioctl

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

3 个答案:

答案 0 :(得分:11)

使用getsockopt()。 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发现关闭,它' ll将最大大小设置为接口MTU并将任何更大的片段分段。如果您通过以太网发送,则典型的MTU为1500字节。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

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

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

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