2008-08-25 39 views

答えて

1

UDPは接続指向ではないので、2つのパケットが一緒に属していることを示す方法はありません。その結果、単一のIPパケット(65535)の最大サイズによって制限されます。 IPパケットのサイズには、IPヘッダー(通常20バイト)とUDPヘッダー(8バイト)も含まれているため、送信できるデータは多少少なくなります。

このIPパケットは、より小さいパケット(例えば、イーサネットでは〜1500バイト)に収まるように断片化することができます。

私はこれをさらに制限するOSは認識していません。

11

getsockopt()を使用してください。 This siteには、使用法や検索可能なオプションの内訳があります。

Windowsでは、あなたが行うことができます:Linuxの場合

 
int optlen = sizeof(int); 
int optval; 
getsockopt(socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *)&optval, &optlen); 

、UDPのmanページによると、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オクテット)を送信しようとすると、「Message too long/EMSGSIZE」になります。