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

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

14

使用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字节。


5

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

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

如果在Leopard上尝试通过本地回环发送9216个八位组的UDP消息,将会导致“消息过长/EMSGSIZE”的错误。


2
由于UDP不是面向连接的,所以没有办法指示两个数据包是属于同一组的。因此,您受到单个IP数据包的最大大小限制(65535)。您可以发送的数据稍微小一些,因为IP数据包大小还包括IP首部(通常为20字节)和UDP首部(8字节)。
请注意,此IP数据包可以分段以适应较小的数据包(例如以太网约1500字节)。
我不知道有任何操作系统会进一步限制这一点。
额外内容:
UDP数据包的SO_MAX_MSG_SIZE
IPv4:65507字节 IPv6:65527字节

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接