如何获取作为UDP端口打开的套接字的sendto(..)调用可以传递的最大字节数?
sendto(..)
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字节。
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”。
xv8emn3q3#
由于UDP不是面向连接的,因此无法表示两个数据包属于一起。因此,您受到单个IP数据包的最大大小(65535)的限制。您可以发送的数据略小于该值,因为IP数据包大小还包括IP报头(通常为20字节)和UDP报头(8字节)。请注意,这个IP数据包可以被分割成更小的数据包(例如,以太网的约1500字节)。我不知道任何操作系统进一步限制这一点。
SO_MAX_MSG_SIZE个UDP数据包
SO_MAX_MSG_SIZE
3条答案
按热度按时间o2gm4chl1#
This site有一个很好的用法分类和可以检索的选项。
在Windows中,您可以:
字符串
对于Linux,根据UDP手册页,内核将使用MTU发现(它将检查此处和目的地之间的最大UDP数据包大小,并选择该大小),或者如果MTU发现关闭,它将设置接口MTU的最大大小并将任何更大的数据分段。如果您通过以太网发送,典型的MTU是1500字节。
mkshixfv2#
在Mac OS X上,发送(SO_SNDBUF)和接收(SO_RCVBUF)有不同的值。这是发送缓冲区的大小(man getsockopt):
字符串
尝试发送更大的消息(通过本地UDP发送的UDP上的Leopard 9216八位字节)将导致“Message too long / EMSGSIZE”。
xv8emn3q3#
由于UDP不是面向连接的,因此无法表示两个数据包属于一起。因此,您受到单个IP数据包的最大大小(65535)的限制。您可以发送的数据略小于该值,因为IP数据包大小还包括IP报头(通常为20字节)和UDP报头(8字节)。
请注意,这个IP数据包可以被分割成更小的数据包(例如,以太网的约1500字节)。
我不知道任何操作系统进一步限制这一点。
奖励
SO_MAX_MSG_SIZE
个UDP数据包