epa*_*tel 7 unix sockets networking udp ioctl
如何获得可以传递给sendto(..)
作为UDP端口打开的套接字的调用的最大字节数?
Ste*_*e M 11
使用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 字节)。
我不知道有任何操作系统进一步限制这一点。
SO_MAX_MSG_SIZE
UDP数据包的
归档时间: |
|
查看次数: |
14215 次 |
最近记录: |