最近、私は通常の通信ネットワークユーザーを達成するために、データ「放送」を達成するために、マルチキャストの方法を使用することを検討して、分散リアルタイムチャットプログラムを書きます
ビューの情報の問い合わせに応じて、UDPは、効果的な、内部ネットワーク(同一ネットワークセグメント)をブロードキャストし、より良いネットワーク間のマルチキャストバルクデータを得ることができます。
- 簡単な紹介
IPネットワーク送信は、ユニキャスト、マルチキャスト(マルチキャスト)、放送の3種類に分けられます。通常、私たちの最も人気のあるネットワークのひとつは、ユニキャスト送信に属し、かつ、多くのマルチキャストグループの概念は、送信側は、グループ、ネットワークにデータを送信するマルチキャスト伝送モードを自動的にルータを介してデータを送信下端にグループのすべてのリスナーをIGMPを使用しています。ブロードキャストおよびマルチキャスト、いくつかの類似のようなパケットを受信するかどうかこれらの端子喜んで、パケットサブネットの配信端末に各ルータことを除いて。
非常に(のみブロードキャストネットワークブロードキャストを含む)されたブロードキャストネットワーク帯域幅の消費に関しては、UDPマルチキャストが大きく、放送グループに、彼が受信するためにUDPマルチキャストデータを端末のみが最適化されています。UDPマルチキャストは、コネクション、データグラム接続で使用され、それが信頼できるものではありません。すなわち、データが受信端末に到達することはできませんし、データの到着順序は保証されません。UDPは、データの信頼性を保証するものではありません。しかし、全てのデータ伝送速度が非常に高速です。
- IPマルチキャストアドレス
IPマルチキャスト通信は、IPマルチキャストアドレスは、224.0.0.0から239.255.255.255までのクラスDのIPアドレスである、特殊なマルチキャストアドレスが必要です。その多くのアドレスは特別な目的のために予約されているがあります。それらのほとんどが(例えばIGMPプロトコルなど)特定の目的のために保有されているので、224.0.0.255にアドレス224.0.0.0は、使用しないことをお勧めです
- IGMPプロトコル
IGMPは、IPマルチキャストの基本です。IPプロトコルは、マルチキャストのサポートを追加するために表示された後、IGMPを生産しました。IGMPは、実際にデータが後でこのマルチキャストグループに到着したときに、ルータはそれを放棄しないだろう、データが興味を持って1つのマルチキャストグループに送信されたサブネット内のルータ、ルータを教えてくれありません、代わりに、彼はすべての利害の顧客に転送しました。A及びBが異なるサブネットマルチキャスト通信するようにした場合、すべてのルータがABサポートIGMPプロトコルとの間に配置されなければならない、またはAB間で通信することができません。
- 基本的な手順UDPマルチキャスト
- ソケットを確立
- ソケットとポートのバインド
- マルチキャストグループに参加
- 送信とはsendto /のrecvfromを介してデータを受け取り、
- 閉じるソケット
- 例を送ります
たIPAddress IP = IPAddress.Parse( "224.1.2.3");
ソケットS =新しいソケット(AddressFamily.InterNetwork、SocketType.Dgram、ProtocolType.Udp)。
s.SetSocketOption(SocketOptionLevel.IP、SocketOptionName.MulticastTimeToLive、1)。
IPEndPoint IPEP =新しいIPEndPoint(IP、5000);
......
s.SendTo(バフ、buff.Length、SocketFlags.None、IPEP)。
......
S。CLOSE()。
- recv例
ソケットS =新しいソケット(AddressFamily.InterNetwork、SocketType.Dgram、ProtocolType.Udp)。
IPEndPoint IPEP =新しいIPEndPoint(IPAddress.Any、5000);
s.Bind(IPEP)。
s.SetSocketOption(SocketOptionLevel.IP、SocketOptionName.AddMembership、
新しいMulticastOption(IPAddress.Parse( "224.1.2.3")、IPAddress.Any));
......
s.Receive(B、4、SocketFlags.None)。
......
S。CLOSE()。
ます。https://my.oschina.net/dake/blog/196723で再現