Share via


고급 소켓 컨트롤을 사용하는 방법(HTML)

[ 이 문서는 Windows 런타임 앱을 작성하는 Windows에서 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]

이 항목에서는 Windows 스토어 앱에서 DatagramSocket, StreamSocketStreamSocketListener 기능을 사용할 경우 고급 소켓 컨트롤을 사용하는 방법을 보여 줍니다.

알아야 할 사항

기술

사전 요구 사항

  • 이 항목의 다음 예제는 JavaScript로 제공됩니다. 소켓을 기본적으로 이해하고 있는 것이 좋습니다.

고급 컨트롤 개요

DatagramSocket, StreamSocketStreamSocketListener 클래스는 모두 고급 컨트롤을 사용하는 데 동일한 모델을 따릅니다. 위 기본 클래스에는 각각 고급 컨트롤에 액세스할 수 있는 관련 클래스가 있습니다.

고급 컨트롤을 사용하는 기본 모델은 세 가지 클래스에 대해 모두 동일합니다. 아래 설명에서는 StreamSocket을 예로 사용하지만 DatagramSocket 또는 StreamSocketListener에도 동일한 프로세스를 사용할 수 있습니다.

연결 작업 또는 소켓을 바인딩하는 작업을 실행하기 전에 앱은 항상 StreamSocketControl에서 속성을 설정해야 합니다. 따라서 소켓이 생성된 후에 바로 고급 옵션을 설정하는 것이 좋습니다. 소켓이 ConnectAsync 메서드 중 하나를 호출한 후에 StreamSocketControl 속성을 설정하려고 하지 마세요.

데이터그램 소켓 컨트롤

DatagramSocket은 UDP 데이터그램 소켓을 사용하여 네트워크 통신을 지원합니다. DatagramSocket에 대한 고급 옵션은 다음 단일 옵션으로 제한됩니다.

서비스 품질은 DatagramSocket 개체에서 패킷을 받기 위한 스레드 우선 순위에 영향을 미칩니다. 서비스 품질을 SocketQualityOfService 열거형의 두 가지 가능한 값 중 하나로 설정할 수 있습니다. normal 설정은 DatagramSocket을 만들 때 기본값입니다. lowLatency 설정은 패킷을 받기 위한 스레드 우선 순위를 증가시킵니다. 이 옵션은 일반적으로 타이밍에 매우 민감한 오디오 또는 유사한 앱에만 사용됩니다.

다음 예제에서는 DatagramSocket를 만들고 타이밍에 민감한 앱에 대해 DatagramSocketControl.QualityOfServicelowLatency로 설정합니다. 이 작업이 완료되면 앱은 DatagramSocket에서 소켓을 바인딩하거나 연결하는 다른 메서드를 호출할 수 있습니다.

    var clientSocket = new Windows.Networking.Sockets.DatagramSocket();

    // The control object is associated with the socket 

    // Get the current setting for quality of service
    // This isn't needed, but it shows how to get the current setting
    var currentSetting = clientSocket.Control.QualityOfService; 

    // Set quality of service to low latency
    clientSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
   
    // Now use the DatagramSocket to call:
    // BindEndpointAsync, BindServiceNameAsync, 
    // ConnectAsync, GetOutputstreamAsync, or 
    // JoinMulticastGroup

StreamSocket 소켓 컨트롤

StreamSocket은 TCP 스트림 소켓을 사용하여 네트워크 통신을 지원합니다. StreamSocket에 대한 고급 옵션에는 다음 여러 가지가 있습니다.

이 예제에서는 Nagle 알고리즘을 사용하거나 사용하지 않을지 여부를 제어하는 StreamSocketControl.NoDelay 속성을 변경합니다.

Nagle 알고리즘은 네트워크를 통해 보내야 하는 패킷 수를 줄여 TCP/IP 네트워크의 효율성을 향상시키는 기술입니다. 이 알고리즘은 데이터를 작은 청크로 반복해서 내보내는 응용 프로그램으로 인해 발생하는 문제를 처리합니다. 다른 헤더 옵션이 없는 IPv4용 TCP 패킷에는 40바이트의 헤더(IP에 20바이트, TCP에 20바이트)가 있습니다. 따라서 앱이 패킷으로 4바이트만 보낼 경우 패킷 데이터의 오버헤드가 매우 커집니다. 이러한 문제는 대부분의 키 누름이 즉시 전송되는 1바이트 또는 2바이트의 데이터만 생성할 수 있는 원격 액세스 프로토콜(예: 텔넷 또는 보안 셸)에서 발생할 수 있습니다. 느린 연결을 사용하여 이러한 패킷 여러 개를 네트워크를 통해 동시에 전송할 수 있습니다. Nagle 알고리즘은 여러 작은 크기의 보내는 메시지를 결합한 후 이를 한번에 보내는 방식으로 작동합니다. 보낸 사람이 승인을 받지 못한 보낸 패킷이 있는 경우 보낸 사람은 전체 패킷의 출력 가치가 있을 때까지 출력 버퍼링을 유지합니다. 이를 통해 출력을 한번에 보낼 수 있습니다. Nagle 알고리즘을 적용하면 대기 시간이 길어지면서 대역폭이 증가할 수 있습니다. 내부적으로 버퍼링하는 잘 작성된 앱은 Nagle 알고리즘을 사용할 필요가 없습니다.

StreamSocket을 만들 때 기본 설정은 Nagle 알고리즘을 사용하지 않도록 이 옵션을 true로 설정하는 것입니다. 이 설정은 작은 크기의 메시지를 보낼 때 잠재적인 지연을 줄여 줍니다. 그러나 여러 개의 작은 패킷을 보내는 앱에 StreamSocket을 사용하여 대기 시간이 문제가 되지 않으면 Nagle 알고리즘을 사용하여 효율성을 높일 수 있습니다.

다음 예제에서는 StreamSocket을 만들고 StreamSocketControl.NoDelayfalse로 설정합니다. 이 작업이 완료되면 앱은 StreamSocket에서 소켓을 연결하는 다른 메서드를 호출할 수 있습니다.

    var clientSocket = new Windows.Networking.Sockets.StreamSocket();

    // The control object is associated with the socket 

    // Get the current setting for this option
    // This isn't needed, but it shows how to get the current setting
    var currentSetting = clientSocket.Control.NoDelay; 

    // Don't disable the nagle algorithm
    clientSocket.Control.NoDelay = false;
   
    // Now you can use the StreamSocket to call one of the
    // ConnectAsync methods

StreamSocketListener 소켓 컨트롤

StreamSocketListener는 TCP 스트림 소켓을 사용하여 들어오는 네트워크 연결의 수신 대기를 지원합니다. StreamSocketListener에 대한 고급 옵션은 다음 단일 옵션으로 제한됩니다.

서비스 품질은 StreamSocketListener 개체가 연결을 받을 때 생성되는 StreamSocket 개체에서 패킷을 받기 위한 스레드 우선 순위에 영향을 미칩니다. 서비스 품질을 SocketQualityOfService 열거형의 두 가지 가능한 값 중 하나로 설정할 수 있습니다. normal 설정은 연결을 받을 경우 StreamSocket이 생성될 때의 기본값입니다. lowLatency 설정은 생성된 StreamSocket에서 패킷을 받기 위한 스레드 우선 순위를 증가시킵니다. 이 옵션은 일반적으로 타이밍에 매우 민감한 오디오 또는 유사한 앱에 대한 연결을 수락할 때만 사용됩니다.

다음 예제에서는 StreamSocketListener를 만들고 타이밍에 민감한 앱에 대해 StreamSocketListener.QualityOfServicelowLatency로 설정합니다. 이 작업이 완료되면 앱은 StreamSocketListener에서 다른 메서드를 호출하여 들어오는 연결 요청의 수신 대기를 시작할 수 있습니다.

    var listenSocket = new Windows.Networking.Sockets.StreamSocketListener();

    // The control object is associated with the socket 

    // Get the current setting for quality of service
    // This isn't needed, but it shows how to get the current setting
    var currentSetting = listenSocket.Control.QualityOfService; 

    // Set quality of service to low latency
    listenSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
   
    // Now you can use the StreamSocketListener to 
    // bind to a service name and begin listening for 
    // incoming connection requests

설명

컨트롤 데이터 외에 이러한 기본 클래스에서 추가 소켓 정보에 대한 액세스를 제공하는 유사한 관련 클래스 집합이 있습니다.

추가 소켓 정보에 액세스하는 모델은 컨트롤 데이터에 대한 액세스와 동일한 디자인을 따릅니다. 아래 설명에서는 StreamSocket을 예로 사용합니다.

소켓 정보와 소켓 컨트롤 클래스 사이에는 한 가지 주요한 차이점이 있습니다. StreamSocketControl 인스턴스의 속성은 읽거나 쓸 수 있습니다(가져오기 또는 설정). 이와 반대로 StreamSocketInformation 인스턴스의 속성은 읽기 전용입니다(가져오기). StreamSocket이 생성된 후 앱은 언제든지 StreamSocketControl 또는 StreamSocketInformation 인스턴스에서 속성 값을 검색할 수 있습니다. 그러나 연결 작업 또는 소켓을 바인딩하는 작업을 실행하기 전에 앱은 항상 StreamSocketControl 인스턴스에서 속성을 설정해야 합니다.

관련 항목

기타

소켓을 사용하여 연결

데이터그램 소켓을 사용하여 연결하는 방법

스트림 소켓을 사용하여 연결하는 방법

TLS/SSL을 통해 소켓 연결의 보안을 유지하는 방법

참조

DatagramSocket

DatagramSocketControl

DatagramSocketInformation

StreamSocket

StreamSocketControl

StreamSocketInformation

StreamSocketListener

StreamSocketListenerControl

StreamSocketListenerInformation

Windows.Networking.Sockets