2008-08-25 67 views

回答

1

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

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

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

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发现关闭,它会将最大大小设置为接口MTU并对任何更大的碎片进行碎片化。如果您通过以太网发送数据,则典型MTU为1500字节。

5

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

的getsockopt(袜子,SOL_SOCKET,SO_SNDBUF,为(int *)& optval的,& optlen);

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