다음을 통해 공유


DatagramSocket 클래스

정의

UDP 데이터그램 소켓을 사용하여 네트워크 통신을 지원합니다.

코드 예제는 소켓을 참조하세요.

public ref class DatagramSocket sealed : IClosable
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DatagramSocket final : IClosable
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class DatagramSocket final : IClosable
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class DatagramSocket : System.IDisposable
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class DatagramSocket : System.IDisposable
function DatagramSocket()
Public NotInheritable Class DatagramSocket
Implements IDisposable
상속
Object Platform::Object IInspectable DatagramSocket
특성
구현

Windows 요구 사항

디바이스 패밀리
Windows 10 (10.0.10240.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v1.0에서 도입되었습니다.)
앱 기능
ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

설명

DatagramSocket 클래스는 UDP 데이터그램 소켓을 사용하여 네트워크 통신을 지원합니다. DatagramSocket 개체는 UDP 패킷을 보내는 클라이언트 앱 또는 들어오는 UDP 데이터를 수신하는 서버 앱에 사용할 수 있습니다.

DatagramSocket 개체를 사용하여 데이터를 보내거나 받으려면 몇 가지 단계가 필요합니다. 앱은 먼저 MessageReceived 이벤트를 이벤트 처리기에 할당합니다. 원격 엔드포인트(예: 서버 시나리오)에서 들어오는 패킷을 수신 대기하기 위해 앱은 BindEndpointAsync 또는 BindServiceNameAsync 메서드를 호출하여 DatagramSocket을 로컬 서비스 이름 또는 UDP 포트에 바인딩합니다. 그러나 앱이 단일 원격 엔드포인트(예: 클라이언트 시나리오)와 통신해야 하는 경우 앱은 ConnectAsync 메서드를 호출합니다. 바인딩 또는 연결 작업 전에 MessageReceived 이벤트 처리기를 설정해야 합니다. 그렇지 않으면 오류가 발생합니다.

일반적인 작업 순서는 다음과 같습니다.

  1. DatagramSocket을 만듭니다.
  2. Control 속성을 사용하여 DatagramSocketControl 개체를 검색하고 고급 컨트롤을 설정합니다. 이 단계는 일반적으로 대부분의 앱에서 필요하지 않습니다.
  3. MessageReceived 이벤트를 이벤트 처리기에 할당합니다.
  4. 원격 엔드포인트(예: 서버 시나리오)에서 들어오는 패킷을 수신 대기하려면 BindEndpointAsync 또는 BindServiceNameAsync 메서드를 호출하여 DatagramSocket을 로컬 서비스 이름 또는 UDP 포트에 바인딩합니다.
  5. 단일 원격 엔드포인트(예: 클라이언트 시나리오)와 통신하려면 ConnectAsync 메서드를 호출하여 DatagramSocket을 특정 원격 엔드포인트에 바인딩합니다.
  6. 원격 엔드포인트의 메시지가 도착할 때마다 MessageReceived 이벤트 처리기가 호출됩니다. 이 클래스를 사용하여 멀티캐스트 그룹에 조인하고 UDP 패킷을 멀티캐스트 그룹으로 보낼 수도 있습니다. 자세한 내용은 JoinMulticastGroup 메서드를 참조하세요.

예외 처리

DatagramSocket 클래스에서 비동기 메서드를 호출할 때 예외를 처리하는 코드를 작성해야 합니다. 매개 변수 유효성 검사 오류, 이름 확인 오류 및 네트워크 오류로 인해 예외가 발생할 수 있습니다. 네트워크 오류(예: 연결 손실, 연결 오류 및 서버 오류)의 예외는 언제든지 발생할 수 있습니다. 이러한 오류로 인해 예외가 발생합니다. 앱에서 처리하지 않으면 예외로 인해 전체 앱이 런타임에 의해 종료될 수 있습니다.

Windows.Networking.Sockets 네임스페이스에는 소켓을 사용할 때 오류를 처리하기 위한 편리한 도우미 메서드와 열거형이 있습니다. 특정 네트워크 예외를 앱에서 다르게 처리하는 데 유용합니다. 또한 앱은 매개 변수 유효성 검사 오류에 대한 예외의 HRESULT 를 사용하여 예외를 발생시킨 오류에 대한 자세한 정보를 알아볼 수 있습니다.

가능한 예외 및 예외를 처리하는 방법에 대한 자세한 내용은 네트워크 앱에서 예외 처리를 참조하세요.

Wi-Fi Direct에서 DatagramSocket 사용

앱은 Windows.Devices.WiFiDirect 네임스페이스의 클래스를 사용하여 Wi-Fi Direct를 사용하는 디바이스 간의 네트워크 데이터 전송에 DatagramSocket을 사용할 수 있습니다. WiFiDirectDevice 클래스를 사용하여 Wi-Fi Direct(WFD) 지원 디바이스가 있는 다른 디바이스를 찾을 수 있습니다. WiFiDirectDevice.GetDeviceSelector 메서드는 가까운 WFD 디바이스에 대한 디바이스 식별자를 가져옵니다. 가까운 WFD 디바이스에 대한 참조가 있으면 WiFiDirectDevice.GetConnectionEndpointPairs 메서드를 호출하여 EndpointPair 개체를 가져올 수 있습니다. DatagramSocket 클래스의 메서드를 사용하여 EndpointPair 개체로 데이터를 보내고 받을 수 있습니다. 자세한 내용은 Windows.Devices.WiFiDirectWiFiDirectDevice를 참조하세요.

Windows Server 2012에서 DatagramSocket 사용

Windows Server 2012 및 Windows Server 2012 R2에서는 Media Foundation 기능을 사용하지 않는 한 Windows.Networking.Sockets 네임스페이스에서 대부분의 클래스를 구현하는Windows.Networking.dll로드되지 않습니다. 따라서 Media Foundation 기능을 사용하지 않도록 설정하면 Windows.Networking.Sockets 네임스페이스의 DatagramSocket 및 관련 소켓 클래스를 사용하는 앱이 실패합니다. Media Foundation 기능이 비활성화된 Windows Server 2012 또는 Windows Server 2012 R2가 설치됩니다.

Media Foundation 기능은 서버 관리자 사용하거나 명령 프롬프트 또는 스크립트에 다음 텍스트를 입력하여 Windows Server 2012 또는 Windows Server 2012 R2에서 사용하도록 설정할 수 있습니다.

dism /online /enable-feature /featurename:ServerMediaFoundation Media Foundation 기능을 사용하도록 설정하면 사용자에게 다시 시작하라는 메시지가 표시됩니다. 컴퓨터를 다시 시작하면 Windows.Networking.Sockets 네임스페이스의 소켓 및 WebSocket에 대한 클래스가 예상대로 작동합니다.

DatagramSocket을 사용하여 DNS 서비스 레코드 확인

앱은 SRV 레코드에 속하는 대상 DNS 주소와 통신할 수 있습니다. 예를 들어 Contoso 도메인의 NAT(Network Address Translation)(STUN) 서비스를 통한 UDP의 단순 순회는 에 해당합니다 _stun._udp.contoso.com. 해당 서비스 이름은 서버 DNS 이름(예: stunServer01.contoso.com)에 해당합니다.

해당 서비스에 대한 서버의 DNS 주소에 연결하려면 DatagramSocket instance 다음 메서드 호출을 사용합니다.

using Windows.Networking.Sockets;

DatagramSocket socket = new DatagramSocket();
socket.ConnectAsync(new HostName("contoso.com"), "stun");

프로토콜은 DatagramSocket 인스턴스에 대한 UDP로 유추됩니다. 메서드는 밑줄 문자를 처리합니다.

DNS는 SRV 계층 구조를 갖도록 구성할 수 있습니다. DNS SRV 리소스 레코드에는 형식 _stun._service01._udp.contoso.com이 있을 수 있습니다. 이 예제에서는 DatagramSocket instance 다음 메서드 호출을 사용합니다.

socket.ConnectAsync(new HostName("contoso.com"), "stun._service01");

이러한 코드 조각은 ConnectAsync를 사용합니다. GetOutputStreamAsyncGetEndpointPairsAsync 메서드는 서비스에 연결하는 유사한 사용을 지원합니다.

생성자

DatagramSocket()

DatagramSocket 개체를 만듭니다.

속성

Control

DatagramSocket 개체의 소켓 제어 데이터를 가져옵니다.

Information

DatagramSocket 개체의 로컬 및 원격 호스트 이름 및 로컬 및 원격 서비스 이름에 대한 소켓 정보를 가져옵니다.

OutputStream

원격 호스트에 쓸 출력 스트림을 가져옵니다.

메서드

BindEndpointAsync(HostName, String)

DatagramSocket에서 로컬 호스트 이름 및 로컬 서비스 이름에 대한 바인딩 작업을 시작합니다.

BindServiceNameAsync(String)

DatagramSocket에서 로컬 서비스 이름으로 바인딩 작업을 시작합니다.

BindServiceNameAsync(String, NetworkAdapter)

DatagramSocket에서 로컬 서비스 이름 및 특정 네트워크 인터페이스에 바인딩 작업을 시작합니다.

CancelIOAsync()

보류 중인 읽기를 취소하고 DatagramSocket 개체를 통해 씁니다.

Close()

DatagramSocket 개체를 닫고 DatagramSocket에서 보류 중인 작업을 중단합니다.

ConnectAsync(EndpointPair)

DatagramSocket에서 EndpointPair 개체로 지정된 원격 네트워크 대상에 연결 작업을 시작합니다.

ConnectAsync(HostName, String)

DatagramSocket에서 원격 호스트 이름 및 원격 서비스 이름으로 지정된 원격 대상에 연결 작업을 시작합니다.

Dispose()

관리되지 않는 리소스의 확보, 해제 또는 다시 설정과 관련된 애플리케이션 정의 작업을 수행합니다.

EnableTransferOwnership(Guid)

앱이 활성 상태가 아닌 동안 이 DatagramSocket 에 대한 트래픽이 도착할 때 소켓 브로커에 의해 앱의 백그라운드 작업을 트리거할 수 있도록 합니다.

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

시스템이 연결된 대기 상태인 동안 이 DatagramSocket 에 대한 트래픽이 도착하면 소켓 브로커에 의해 앱의 백그라운드 작업을 트리거할 수 있습니다.

GetEndpointPairsAsync(HostName, String)

원격 네트워크 대상으로 데이터그램을 보내는 데 사용할 수 있는 원격 호스트 이름 및 원격 서비스 이름을 기반으로 하는 EndpointPair 개체 목록을 가져옵니다.

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

원격 호스트 이름 및 원격 서비스 이름 및 사용할 정렬 순서를 기반으로 하는 EndpointPair 개체 목록을 가져옵니다.

GetOutputStreamAsync(EndpointPair)

EndpointPair 개체로 지정된 원격 네트워크 대상으로 IOutputStream을 가져오는 작업을 시작한 다음, 네트워크 데이터를 보내는 데 사용할 수 있습니다.

GetOutputStreamAsync(HostName, String)

IOutputStream을 원격 호스트 이름 및 네트워크 데이터를 보내는 데 사용할 수 있는 원격 서비스 이름으로 지정된 원격 대상으로 가져오는 작업을 시작합니다.

JoinMulticastGroup(HostName)

DatagramSocket 개체를 멀티캐스트 그룹에 조인합니다.

TransferOwnership(String)

DatagramSocket의 소유권을 소켓 조정 서비스로 전송합니다. 이 서비스는 소켓 활동을 모니터링하고 활동이 있는 경우 백그라운드 작업을 통해 앱에 알깁니다.

TransferOwnership(String, SocketActivityContext)

DatagramSocket의 소유권을 소켓 조정 서비스로 전송합니다. 이 서비스는 소켓 활동을 모니터링하고 활동이 있는 경우 백그라운드 작업을 통해 앱에 알깁니다.

TransferOwnership(String, SocketActivityContext, TimeSpan)

DatagramSocket의 소유권을 소켓 조정 서비스로 전송합니다. 이 서비스는 소켓 활동을 모니터링하고 활동이 있는 경우 백그라운드 작업을 통해 앱에 알깁니다.

이벤트

MessageReceived

DatagramSocket 개체에서 메시지가 수신되었음을 나타내는 이벤트입니다.

적용 대상

추가 정보