2008-08-25 91 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」。