기본적으로 위 예제 코드는 잘 동작하지만, Receive 코드가 작동되지 않았다.
MSDN의 코드를 참조 해 Socket 기반, MulticastOption 을 적용 해 보니 아주 잘 되었다.
내 경우 네트워크 인터페이스를 여러 개 사용하는게 원인인 듯 싶었다.
MSDN Socket 기반 코드를 커스텀해 사용할 수도 있었지만, Socket 기반 코드는 추상화가 덜 되어
좀 지저분하다.. (C++ 소켓 프로그래밍 정도는 아니지만)
그래서 맨 위 예제서 UdpClient 기반 하에 작동되는
static void Main(string[] args)
{
// (1) UdpClient 객체 성성
UdpClient udp = new UdpClient();
// (2) UDP 로컬 IP/포트에 바인딩
// udp.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, true);
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, 14555);
udp.Client.Bind(localEP);
// (3) Multicast 그룹에 Join
IPAddress multicastIP = IPAddress.Parse("239.0.0.222");
IPAddress localIP = IPAddress.Parse(/* localIP */);
udp.JoinMulticastGroup(multicastIP, localIP);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
while (!Console.KeyAvailable)
{
// (4) Multicast 수신
byte[] buff = udp.Receive(ref remoteEP);
string data = Encoding.ASCII.GetString(buff, 0, buff.Length);
Console.WriteLine(data);
}
}
JoinMulticastGroup 내에 오버로딩으로 존재하는 함수의 여부를 찾았다.
udp.JoinMulticastGroup(multicastIP, localIP);
부분에 알맞은 IP를 기입하고, 해당 예제의 송신부 코드를 기재하면 잘 작동할 것이다.
끝.
'Programming > C#' 카테고리의 다른 글
[C#] Forms.Timer vs Threading.Timer (0) | 2022.07.25 |
---|---|
[C#] SharedMemory 사용법 (0) | 2022.05.12 |
[C#]System.Timers.Timer 사용시 Race Condition (0) | 2021.12.22 |
[C#] 반복문 캐싱 최적화 (0) | 2021.07.14 |
[C#] Task .Wait() vs await 차이점 (0) | 2021.05.04 |