listen 함수(winsock2.h)

수신 대기 함수는 들어오는 연결을 수신 대기하는 상태에 소켓을 배치합니다.

구문

int WSAAPI listen(
  [in] SOCKET s,
  [in] int    backlog
);

매개 변수

[in] s

연결되지 않은 바인딩된 소켓을 식별하는 설명자입니다.

[in] backlog

보류 중인 연결 큐의 최대 길이입니다. SOMAXCONN으로 설정하면 소켓 담당하는 기본 서비스 공급자가 백로그를 적절한 최대 값으로 설정합니다. SOMAXCONN_HINT(N)(여기서 N은 숫자)로 설정하면 백로그 값은 N이 되고 범위 내에서 조정됩니다(200, 65535). SOMAXCONN_HINT 사용하여 SOMAXCONN에서 백로그를 가능한 것보다 큰 값으로 설정할 수 있습니다.

SOMAXCONN_HINT Microsoft TCP/IP 서비스 공급자에서만 지원됩니다. 실제 백로그 값을 가져오는 표준 프로비저닝은 없습니다.

반환 값

오류가 발생하지 않으면 listen 은 0을 반환합니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEADDRINUSE
소켓의 로컬 주소가 이미 사용 중이며 SO_REUSEADDR 주소를 다시 사용할 수 있도록 소켓이 표시되지 않았습니다. 이 오류는 일반적으로 바인딩 함수를 실행하는 동안 발생하지만 바인딩 이 부분적으로 와일드카드 주소(ADDR_ANY 포함)에 있고 이 함수 시 특정 주소를 커밋해야 하는 경우 이 함수까지 지연될 수 있습니다.
WSAEINPROGRESS
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINVAL
소켓이 바인딩으로 바인딩되지 않았습니다.
WSAEISCONN
소켓이 이미 연결되어 있습니다.
WSAEMFILE
더 이상 소켓 설명자를 사용할 수 없습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEOPNOTSUPP
참조된 소켓이 수신 대기 작업을 지원하는 형식이 아닙니다.

설명

연결을 허용하기 위해 소켓은 먼저 소켓 함수를 사용하여 만들어지고 바인딩 함수를 사용하여 로컬 주소에 바인딩됩니다. 수신 대기를 사용하여 들어오는 연결에 대한 백로그를 지정한 다음 accept 함수를 사용하여 연결이 허용됩니다. 연결 지향 소켓, 예를 들어 SOCK_STREAM 형식의 소켓은 수신 대기와 함께 사용됩니다. 소켓 들어오는 연결 요청이 승인되고 프로세스에서 수락 보류 중인 대기 중인 수동 모드로 전환됩니다.

SOMAXCONN백로그은 소켓을 담당하는 기본 서비스 공급자에게 보류 중인 연결 큐의 길이를 적절한 최대 값으로 설정하도록 지시하는 특수 상수입니다.

Windows 소켓 2에서 이 최대값은 기본적으로 큰 값(일반적으로 수백 개 이상)으로 설정됩니다.

Bluetooth 애플리케이션에서 수신 대기 함수를 호출할 때는 몇 개의 클라이언트 연결만 허용되므로 백로그 매개 변수(일반적으로 2~4)에 훨씬 낮은 값을 사용하는 것이 좋습니다. 이렇게 하면 수신 대기 소켓에서 사용하기 위해 할당된 시스템 리소스가 줄어듭니다. 이 권장 사항은 몇 개의 클라이언트 연결만 예상하는 다른 네트워크 애플리케이션에 적용됩니다.

수신 대기 함수는 일반적으로 한 번에 둘 이상의 연결 요청을 가질 수 있는 서버에서 사용됩니다. 연결 요청이 도착하여 큐가 가득 차면 클라이언트는 WSAECONNREFUSED 표시와 함께 오류를 수신합니다.

사용 가능한 소켓 설명자가 없는 경우 계속 작동하려고 수신 대기 합니다. 설명자를 사용할 수 있게 되면 나중에 수신 대기 또는 수락 을 호출하면 백로그 매개 변수에 지정된 현재 또는 가장 최근 값으로 큐를 다시 채우고, 가능한 경우 들어오는 연결에 대한 수신 대기를 다시 시작합니다.

수신 대기 함수가 이미 수신 대기 중인 소켓에서 호출되면 백로그 매개 변수의 값을 변경하지 않고 성공을 반환합니다. 수신 대기 소켓에서 수신 대기하도록 후속 호출에서 백로그 매개 변수를 0으로 설정하는 것은 특히 소켓에 연결이 있는 경우 적절한 재설정으로 간주되지 않습니다.

참고수신 대기와 같은 차단 Winsock 호출을 실행할 때 Winsock은 호출이 완료되기 전에 네트워크 이벤트를 기다려야 할 수 있습니다. Winsock은 이 상황에서 경고 가능한 대기를 수행합니다. 이 대기는 동일한 스레드에서 예약된 APC(비동기 프로시저 호출)에 의해 중단될 수 있습니다. 동일한 스레드에서 지속적인 차단 Winsock 호출을 중단한 APC 내에서 다른 차단 Winsock 호출을 실행하면 정의되지 않은 동작이 발생하며 Winsock 클라이언트에서 시도해서는 안 됩니다.
 

예제 코드

다음 예제에서는 listen 함수를 사용하는 방법을 보여 줍니다.
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

int wmain()
{

    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = 0;

    SOCKET ListenSocket = INVALID_SOCKET;
    sockaddr_in service;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup() failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for incoming connection requests.
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(27015);

    iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"bind function failed with error %d\n", WSAGetLastError());
        iResult = closesocket(ListenSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests 
    // on the created socket
    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
        wprintf(L"listen function failed with error: %d\n", WSAGetLastError());

    wprintf(L"Listening on socket...\n");

    iResult = closesocket(ListenSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}

예제 코드

listen 함수를 사용하는 또 다른 예제는 시작 With Winsock을 참조하세요.

IrDA 소켓에 대한 참고 사항

  • Af_irda.h 헤더 파일을 명시적으로 포함해야 합니다.

호환성

백로그 매개 변수는 기본 서비스 공급자에 의해 결정된 적절한 값으로(자동으로) 제한됩니다. 잘못된 값은 가장 가까운 법적 값으로 대체됩니다. 실제 백로그 값을 확인하는 표준 프로비저닝은 없습니다.

Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.

Windows 8.1Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winsock2.h
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

Winsock 함수

Winsock 참조

받아들일

connect

socket