반응형

C# : 닷넷에서 Broadcast UDP를 보내기(1)

알게된 배경

회사에서 임베이드 분야로 소켓 프로그램을 만들어야 할 일이 있었다. 물론 디바이스 단이 아니라 클라이언트 단의 프로그램이다. 임베이드 분야는 통신을 주로 실시간으로 해야 하며, 단거리 통신을 많이 하기 때문에 TCP 통신보다는 UDP 통신을 많이 사용한다. 특히 동시에 여러대의 디바이스에 신호를 주기 가장 적합한 방식은 Broadcast UDP 방식이다.


Broadcast UDP 란?

이름대로 특정망에 연결된 기기들에게 거의 동시에 동일한 UDP신호를 정해진 포트로 보내는 방식이다. 여기서 거의 동시라는 건 라즈베리 파이같은 기기로 테스트해 본 결과 0.01초 내외의 오차가 있다. 이는 디바이스의 상태와 성능에 따라 조금씩 차이가 있는 것으로 보인다.


Broadcast UDP 원리

사실 원리라고 말하기는 애매하고 규약이라 보는 것이 나을 것이다. 규약조건은 IPv4 기준으로 망을 제공하는 네트워크의 서브 마스크에서 허용되는 IPv4 주소의 비트가 1이 되게 보내면 해당신호는 Broadcast로 인식이 된다. 따라서 Broadcast UDP를 보내기 위해서는 해당 네트워크 망의 서브넷 마스크와 네트워크 제공 IP주소 체계를 알아야 한다.


[보조 설명] 서븐넷 마스크와 Broadcast UDP

서브넷 마스크 주소체계의 고정값과 비고정값을 구분하는 기준이라고 생각하면 된다. 마스크라는 단어의 의미 자체가 가면 혹은 가린다는 뜻이다. 네트워크의 신호는 주로 비트로 표현이 되는데, 마스크의 비트가 1일 경우 해당 값은 가려지는 것이고, 반대로 0 이 되는 부분은 가려지지 않은 값이다.

즉, 255.255.255.0 이라고 할경우 255는 비트상 모두 1이 되어서 255가 되는 부분은 가려져서 내부망 주소에서 구분을 하지 않는다. 반면 0인 부분은 8비트를 가리지 않아서 이론상 0~255의 주소를 구분할 수 있다.

다만, 서브마스크로 가려지지 않은 모든 비트값이 1이 될 경우에는 받는 UDP신호는 Broadcast UDP로 인식이 되어서 특정 IP가 아닌 모든 디바이스에 동일하게 전송하도록 약속이 되어 있다.



소스코드

Broadcast UDP의 규약과 구글 검색을 통한 MSDN 문서를 좀 더 찾아보면 간단히 찾아 볼 수 있다. 물론 스택오버플로어의 내용에다가 약간의 문자열을 파지 하는 방법도 있지만, 가능하면 MS에서 만들어 놓은 class를 활용을 해보도록 하자.


using System;
using System.Net.NetworkInformation;

class Program
{

// print ip address, submask
private void PrintIpAddressAndSubmask()
{
    NetworkInterface[] netInter = NetworkInterface.GetAllNetworkInterfaces();
    foreach(var itInter in netInter)
    {
        // 인터넷 혹은 망에 연결된 것만 남김
        if(itInter.OperationsalStatus != OperationalStatus.Up)
            continue;
        // 유선(Ethernet)과 무선(Wireless80211)만 남김
        if(itInter.NetworkInterfaceType != NetworkInterfaceType.Ethernet
            && itInter.NetworkInterfaceType != NetworkInterfaceType.Wireless80211)
            continue;
        var unicast = itInter.GetIpProperties().UnicastAddress;
        foreach(var itUnicast in unicast)
        {
            // Ip v6는 걸러냄
            if(itUnicast.IPv4Mask.Address == 0)
                continue;
            console.writeLine("\tIp Address : {0}", itUnicast.Address);
            console.writeLine("\tSubnet Mask : {0}", itUnicast.IPv4mask);
        }
    }
}

}





참조 자료

MSDN : UDP 서비스 사용 문서
MSDN : NetworkInterface 클래스



반응형

'C#' 카테고리의 다른 글

C# Winform : Detect Resize (크기 변화 감지)  (0) 2018.02.07
C# : Queue VS ConcurrentQueue  (0) 2018.02.02
C# : const vs readonly  (0) 2017.10.25
C# 싱글톤 패턴 상속용 클래스  (0) 2017.09.29
C# 싱글톤 패턴 : 동적 싱글톤  (0) 2017.09.04

+ Recent posts