質問: new byte[16000]; while (size > 16000) { Array.Copy(sendBytes, size2, data, 0, 8000); udp.Send(data, data.Length); size2 += 8001; size -= 8000; } Array.Copy(sendBytes, size2, data, 0, sendBytes.Length); udp.Send(data, data.Length); ``` このような感じで送信コードを書いてみたのですが、分割して送られてくるByte配列を連結させる方法がわからないです。
回答: TcpClientの質問の続きとして、いくつかアドバイスさせていただきますね。 まずは、分割送信のコード修正案を。 ### 送信コード修正案 ``` byte[] data = new byte[1024]; int rest = sendBytes.Length; while (rest > 0) { int size = Math.Min(rest, 1024); Array.Copy(sendBytes, sendBytes.Length - rest, data, 0, size); udp.Send(data, size); rest -= size; } ``` ### TCPとの違いについて TCPとUDPではいろいろと違いがありますが、問題となっている処理に深く関係することとして、次の違いを意識してコードを書く必要があります。 * UDP はデータ境界が保証されている(一度のsend()/sendto()で送信したデータが相手側で一度のrecv()/recvfrom()で受信されることが保証されているという意味です。)ただし以下のポイントに注意! * UDP は送信したデータが届かないことがある。(データが破棄されたことが送信側/受信側のどちらのアプリケーションにもまったく通知されないことがある。欠落したデータのリカバリー処理が必要な場合、アプリケーションに実装する。) * UDP は送信したデータ順と受信されるデータ順が変わることがある。(送信データの順番を確認したり、入れ替わったデータ順を元の状態に復元する処理が必要な場合、アプリケーションに実装する。) ### UDPの送信データ長について UDP通信では一度に送信するデータ長は最大でも 500 バイトから 1300 バイト程度にするのが一般的です。何故なら、大きすぎるUDPデータは、IP層でのフラグメント分割を引き起こし、フラグメントが遺失し結果としてUDPデータが相手ノード側で破棄されるリスクを増大させるからです。 * (参考サイト) IPパケットの構造とIPフラグメンテーション ### 最後に 実現されようとしているシステムがどのようなものなのか解らないですが、データ送受信のコードの書き方をどうするかということの前に、システムとしてデータリカバリーの実装方法とデータの圧縮(本当に300KBのデータが全部必要なのかなど)、「回線品質の悪い状況」に関する動作保証範囲などについて改めて検討されるほうがよいかと思います。