다음을 통해 공유


UDP 서비스 사용

클래스는 UdpClient UDP를 사용하여 네트워크 서비스와 통신합니다. 클래스의 UdpClient 속성과 메서드는 UDP를 사용하여 데이터를 요청하고 수신하기 위한 Socket 생성의 세부 사항을 추상화합니다.

UDP(사용자 데이터그램 프로토콜)는 원격 호스트에 데이터를 제공하기 위해 최선을 다하는 간단한 프로토콜입니다. 그러나 UDP 프로토콜은 연결 없는 프로토콜이므로 원격 엔드포인트로 전송된 UDP 데이터그램이 도착하도록 보장되지 않으며 전송되는 것과 동일한 순서로 도착하도록 보장되지 않습니다. UDP를 사용하는 애플리케이션은 누락, 중복 및 시퀀스 외부 데이터그램을 처리하도록 준비해야 합니다.

UDP를 사용하여 데이터그램을 보내려면 필요한 서비스를 호스팅하는 네트워크 디바이스의 네트워크 주소와 서비스에서 통신하는 데 사용하는 UDP 포트 번호를 알고 있어야 합니다. IANA(Internet Assigned Numbers Authority)는 일반 서비스에 대한 포트 번호를 정의합니다( 서비스 이름 및 전송 프로토콜 포트 번호 레지스트리 참조). IANA 목록에 없는 서비스에는 1,024~65,535 범위의 포트 번호가 있을 수 있습니다.

특수 네트워크 주소는 IP 기반 네트워크에서 UDP 브로드캐스트 메시지를 지원하는 데 사용됩니다. 다음 설명에서는 인터넷에서 사용되는 IP 버전 4 주소 패밀리를 예로 사용합니다.

IP 버전 4 주소는 32비트를 사용하여 네트워크 주소를 지정합니다. 255.255.255.0의 netmask를 사용하는 클래스 C 주소의 경우 이러한 비트는 4개의 8진수로 구분됩니다. 10진수로 표현될 때 4개의 8진수는 192.168.100.2와 같은 친숙한 점선 쿼드 표기법을 형성합니다. 처음 두 개의 8진수(이 예제에서는 192.168)는 네트워크 번호를 형성하고, 세 번째 옥텟(100)은 서브넷을 정의하고, 마지막 옥텟(2)은 호스트 식별자입니다.

IP 주소의 모든 비트를 하나 또는 255.255.255.255로 설정하면 제한된 브로드캐스트 주소가 형성됩니다. UDP 데이터그램을 이 주소로 보내면 로컬 네트워크 세그먼트의 모든 호스트에 메시지를 전달합니다. 라우터는 이 주소로 전송된 메시지를 전달하지 않으므로 네트워크 세그먼트의 호스트만 브로드캐스트 메시지를 받습니다.

브로드캐스트는 호스트 식별자의 모든 비트를 설정하여 네트워크의 특정 부분으로 보낼 수 있습니다. 예를 들어 192.168.1부터 IP 주소로 식별된 네트워크의 모든 호스트에 브로드캐스트를 보내려면 주소 192.168.1.255를 사용합니다.

다음 코드 예제에서는 포트 11,000에서 UDP 데이터그램을 수신 대기하는 방법을 사용합니다 UdpClient . 클라이언트는 메시지 문자열을 수신하고 콘솔에 메시지를 씁니다.

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class UDPListener
   Private Const listenPort As Integer = 11000

   Private Shared Sub StartListener()
      Dim listener As New UdpClient(listenPort)
      Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
      Try
         While True
            Console.WriteLine("Waiting for broadcast")
            Dim bytes As Byte() = listener.Receive(groupEP)
            Console.WriteLine("Received broadcast from {0} :", groupEP)
            Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytes.Length))
         End While
      Catch e As SocketException
         Console.WriteLine(e)
      Finally
         listener.Close()
      End Try
   End Sub 'StartListener

   Public Shared Sub Main()
      StartListener()
   End Sub 'Main
End Class 'UDPListener
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPListener
{
    private const int listenPort = 11000;

    private static void StartListener()
    {
        UdpClient listener = new UdpClient(listenPort);
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

        try
        {
            while (true)
            {
                Console.WriteLine("Waiting for broadcast");
                byte[] bytes = listener.Receive(ref groupEP);

                Console.WriteLine($"Received broadcast from {groupEP} :");
                Console.WriteLine($" {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            listener.Close();
        }
    }

    public static void Main()
    {
        StartListener();
    }
}

다음 코드 예제에서는 포트 11,000을 사용하여 Socket UDP 데이터그램을 직접 브로드캐스트 주소 192.168.1.255로 보냅니다. 클라이언트는 명령줄에 지정된 메시지 문자열을 보냅니다.

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Program
    Public Shared Sub Main(args() As [String])
      Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
      s.EnableBroadcast = True
      Dim broadcast As IPAddress = IPAddress.Parse("192.168.1.255")
      Dim sendbuf As Byte() = Encoding.ASCII.GetBytes(args(0))
      Dim ep As New IPEndPoint(broadcast, 11000)
      s.SendTo(sendbuf, ep)
      Console.WriteLine("Message sent to the broadcast address")
   End Sub 'Main
End Class
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        s.EnableBroadcast = true;

        IPAddress broadcast = IPAddress.Parse("192.168.1.255");

        byte[] sendbuf = Encoding.ASCII.GetBytes(args[0]);
        IPEndPoint ep = new IPEndPoint(broadcast, 11000);

        s.SendTo(sendbuf, ep);

        Console.WriteLine("Message sent to the broadcast address");
    }
}

참고하십시오