2011-04-07 14 views
0

私はパケットを送信するためにUdpClientクラスを使用しています。C#UDPパケットを分割する方法は?

大きなパケットは宛先に到達しないため、パケットごとのサイズ制限があるようです。パケットのサイズを小さくしようとしましたが、パケットが宛先に到達することができます。私はどこかで "標準"パケットサイズの制限が512バイトであると読んでいます。

しかし、私はまだ512バイトよりも大きなオブジェクトを送信する必要があります。

私の質問は、バイト配列を小さなパケットに分割するための組み込みの方法です。明らかに、後でスプリットパケットを再構成する必要があります。

私は大きなファイルを自動的に分割できるはずのSocketクラスのSendFileメソッドを見ました。しかし、このメソッドはバイト配列の入力を許可しません(ファイル名のみ)。したがって、メモリ内のデータではなく、ハードドライブに保存されているデータを送信する場合にのみ機能します。

+1

UDPで大量のデータを送信するのはちょっと奇妙です。UDPの場合、データグラムは相手側に届くことが保証されていないからです。彼らがすべて到着したとしても、元の順序であることは保証されていません。 UDPを使用してもよろしいですか? –

+0

それはビデオゲーム用です。私はすでに入力とゲームの状態の転送にUDPを使用しています。しかし、私はあなたが正しいと思っています。おそらくTCP接続は、実際に安全に転送する必要があるため、マップを送信する方が適しています。 – asmo

+1

"私はどこか標準パケットサイズの制限が512バイトであると読んでいます。"あなたのソースは間違っています、イーサネットのフレームサイズは約3倍です。 –

答えて

0

UDPで大量のデータを送信するのは、UDPではデータグラムが相手側に到着することが保証されていないため、少し奇妙なようです。彼らがすべて到着したとしても、元の順序であることは保証されていません。 UDPを使用してもよろしいですか?

Ciaran Keatingが正しくありました。私の必要性のために、TCPがより良い選択でした。

0

SocketクラスのSend関数は、バイト配列をパラメータとして受け取ります。

http://msdn.microsoft.com/en-us/library/w93yy28a.aspx

あなたは代わりに、これを試すことができます。

+0

Sendメソッドはバイト配列を単一のパケットとして送信します。したがって、バイト配列は512バイトを超えることはできません。これが私の問題の原因です。 – asmo

+0

バイト配列をループして一度に512バイトしか送信できません。最後のパケットは明らかに512以下を含んでいます。送信するパケットにパケット番号を入れて、正しい順序で再構成する必要があるでしょう。それ以外は、データを送信するためのほとんどのメソッドは、1バイトの配列だけを送信するように見えます。 – MBU

関連する問題