Multicast Socket(UDP)
멀티캐스트는 인터넷 상의 그룹 통신에 사용 된다. 멀티캐스트에 참여 하는 모든 노드들은 원하는 대로 그룹에 참여 하도록 설정 된다. 라우터는 멑티캐스트 그룹에 참여한 모든 노드들에게 메시지를 전달 한다.
-------------------------------
유니캐스트/브로드 캐스트/멀티캐스트
-------------------------------
유니캐스트(Unicast) : 유니캐스트 패킷은 하나의 목적지로 송신 된다.
브로드캐스트(Broadcast) : 브로드캐스트 데이터 그램은 서브 네트워크의 모든 노드로 송신 된다.
멀티캐스트(Multicast) : 멀티캐스트 데이터 그램은 그룹에 참여 하고 있는 모든 노드로 송신 된다. 이때 노드는 다른 서브 네트워크에 속할 수도 있다.
TCP 프로토콜은 두 시스템끼리 연결 지향형 통신을 제공 한다. 이 프로토콜을 이용하면 Unicast Message만 전송 가능 하다. 만약 하의 서버에 여러 클라이언트가 연결 된다면 모든 클라이언트는 서버는 모든 클라이언트의 연결을 각각 관리 한다. 즉 서버는 각 동시 연결에 대한 리소스가 필요 하며 반드시 모든 클라이언트에 개별 연결을 맺어야 한다. UDP 또한 유니캐스트 메시지를 전송 가능하지만 비 연결 지향형 통신을 하므로 TCP 보다 빠르지만 신뢰 할 수 없는 네트워크를 구성함을 기억 하자.
IP주소의 호스트 비트 부분을 모두 1로 설정하면 브로드캐스트 주소가 된다. 예를들어 192.168.0 주소를 가지는 네트워크에서 255.255.255.0 마스크를 가지는 서브넷의 모든 호스트에 메시지를 전송하려 한다면 브로드캐스트 주소는 192.168.0.255가 된다. 즉 192.168.0 으로 시작하는 IP주소를 가지 호스트는 보로드캐스트 메시지를 수신하게 된다. 브로드캐스트는 항상 UDP 프로토콜을 사용하는 비 연결형 통신으로 구현된다.
-----------------
멀티캐스트 주소
-----------------
D클래스 멀티캐스트 주소는 처음 4비트가 1110 이라는 이진수로 시작 하므로 224.0.0.0 부터 239.255.255.255 까지의 주소가 이에 속한다.그러나 이 부분의 모든 주소가 멀티캐스팅용으로 이용될 수 있는 것은 아니다. 예를 들어 224.0.0.0 부터 224.0.0.255까지의 주소는 튻한 목적을 가진 주소로 라우터는 이를 네트웍으로 전달하지 않는다. 각 국별로 IP 주소를 할당하는 지역 대표부를 가지는 일반적인 IP 주소와 달리 멀티캐스트 주소를 담당하는 곳은 IANA(Internet Assigned Named and Numbers Ahthority, http://www.iana.org)에서 담당 한다.
-------------------------------
.NET에서 멀티캐스트 소켓 사용하기
-------------------------------
1. 송신자
송신 애플리케이션은 특별한 작업을 하지 않으며 단지 멀티캐스트 소켓을 전송하기 위한 UdpClient를 사용 할 뿐이다. 또한 그룹에 참여하는 클라이언트는 멀티캐스트 주소를 알고 있어야 한다.
IPAddress groupAddress = IPAddress.Parse(“234.5.6.11”);
int remotePort = 7777;
int localPort = 7777;
IPEndPoint remoteEP = new IPEndPoint(groupAddress, remotePort);
UcpClient server = new UdpClient(localPort);
server.Send(data, data.Length, remoteEP);
2. 수신자
클라이언트는 멀티캐스트 그룹에 참여해야 한다. 이미 UdpClient 클래스의 JoinMulticastGroup() 메소드에 이러한 기능을 구현해 두었다. 이 메소드는 AddMembership과 MulticastTimrToLive라는 소켓 옵션을 설정하고 라우터에 IGMP 그룹보고 메시지를 송신한다. JoinMulticastGroup() 의 첫번째 인자는 멀티캐스트 그룹 IP 주소를 가리키며 두번째 인자는 TTL 값을 나타낸다.
UdpClient udpClient = UdpClient();
udpClient.JoinMulticastGroup(groupAddress, 32);
----------------------------------------
멀티캐스트를 이용한 Simple Exam
----------------------------------------
MultiCast Client Program
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
public class Muticast_cli
{
public static void Main()
{
UdpClient udpclient = new UdpClient(8080);
IPAddress multicastaddress=IPAddress.Parse("224.0.0.1");
udpclient.JoinMulticastGroup(multicastaddress);
IPEndPoint remote=null;
Encoding enc = Encoding.GetEncoding("KS_C_5601-1987");
while(true)
{
//송신한 원격 호스트에 대한 정보를 IPEndPoint(remote) 참조 파라미터에 채운다
Byte[] data =udpclient.Receive(ref remote);
String strData = enc.GetString(data);
Console.WriteLine(strData);
}
}
}
MultiCast Server Program
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
public class Multi_srv
{
public static void Main()
{
UdpClient udpclient=new UdpClient();
IPAddress multicastaddress = IPAddress.Parse("224.0.0.1");
udpclient.JoinMulticastGroup(multicastaddress);
IPEndPoint remoteep = new IPEndPoint( multicastaddress, 8080 );
Byte [] buffer = null;
Encoding enc = Encoding.GetEncoding("KS_C_5601-1987");
while(true)
{
string str=Console.ReadLine();
buffer=enc.GetBytes(str.ToCharArray());
udpclient.Send(buffer, buffer.Length,remoteep);
}
}
}
-------------------------
socket을 이용한 Multicast
-------------------------
1. Server Program
using System;
using System.Net;
using System.Net.Sockets;
namespace multiCastSend
{
class send
{
send(string mcastGroup, string port, string ttl, string rep)
{
IPAddress ip;
try
{
Console.WriteLine("MCAST Send on Group: {0} Port: {1} TTL: {2}",mcastGroup,port,ttl);
ip=IPAddress.Parse(mcastGroup);
//Socket 클래스의 생성자를 이용하여 UDP 소켓을 생성 한다.
Socket s=new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
//SetSocketOption을 이용하여 AddMemberShip 옵션과 MulticastTimeToLive 옵션 설정
//IMGP 프로토콜이 IP 묘듈에서 구현 되므로 첫번째 인자로 SocketOptionLevel.IP를 넘긴다.
//그룹 멤버쉽을 보고 하기 위해 멀티캐스트 긃의 IP 주소를 지정 한다.
//IP주소는 MulticastOption Helper Class를 이용 한다.
s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership, new MulticastOption(ip));
s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastTimeToLive, int.Parse(ttl));
byte[] b=new byte[10];
for(int x=0;x<b.Length;x++) b[x]=(byte)(x+65);
IPEndPoint ipep=new IPEndPoint(IPAddress.Parse(mcastGroup),int.Parse(port));
Console.WriteLine("Connecting...");
s.Connect(ipep);
for(int x=0;x<int.Parse(rep);x++) {
Console.WriteLine("Sending ABCDEFGHIJ...");
s.Send(b,b.Length,SocketFlags.None);
}
Console.WriteLine("Closing Connection...");
s.Close();
}
catch(System.Exception e) { Console.Error.WriteLine(e.Message); }
}
static void Main(string[] args)
{
new send("224.5.6.7", "5000", "1", "2");
}
}
}
2. Client Program
using System.Net.Sockets;
using System.Net;
using System;
namespace multiCastRecv
{
class recv
{
recv(string mcastGroup, string port)
{
Socket s=new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep=new IPEndPoint(IPAddress.Any,int.Parse(port));
// create an IP endpoint for the incoming data to any IP address on port
// and bind that to the socket.
s.Bind(ipep);
IPAddress ip=IPAddress.Parse(mcastGroup);
s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership,
new MulticastOption(ip,IPAddress.Any));
while(true)
{
byte[] b=new byte[10];
Console.WriteLine("Waiting for data..");
s.Receive(b);
string str = System.Text.Encoding.ASCII.GetString(b,0,b.Length);
Console.WriteLine("RX: " + str.Trim());
}
//s.Close();
}
public static void Main(string[] args)
{
new recv("224.5.6.7","5000");
}
}
}
댓글 없음:
댓글 쓰기