accept 함수(winsock2.h)

accept 함수는 소켓에서 들어오는 연결 시도를 허용합니다.

구문

SOCKET WSAAPI accept(
  [in]      SOCKET   s,
  [out]     sockaddr *addr,
  [in, out] int      *addrlen
);

매개 변수

[in] s

수신 대기 함수를 사용하여 수신 대기 상태에 배치된 소켓을 식별하는 설명자입니다. 연결은 실제로 accept에 의해 반환되는 소켓으로 이루어집니다.

[out] addr

통신 계층에 알려진 연결 엔터티의 주소를 수신하는 버퍼에 대한 선택적 포인터입니다. addr 매개 변수의 정확한 형식은 sockaddr 구조체의 소켓을 만들 때 설정된 주소 패밀리에 의해 결정됩니다.

[in, out] addrlen

addr 매개 변수가 가리키는 구조체의 길이를 포함하는 정수에 대한 선택적 포인터입니다.

반환 값

오류가 발생하지 않으면 accept 는 새 소켓 에 대한 설명자인 SOCKET 형식의 값을 반환합니다. 이 반환된 값은 실제 연결이 이루어지는 소켓에 대한 핸들입니다.

그렇지 않으면 INVALID_SOCKET 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

addrlen에서 참조하는 정수에는 처음에 addr이 가리키는 공간의 양이 포함됩니다. 반환할 때 반환된 주소의 실제 길이(바이트)를 포함합니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAECONNRESET
들어오는 연결이 표시되었지만 호출을 수락하기 전에 원격 피어에 의해 종료되었습니다.
WSAEFAULT
addrlen 매개 변수가 너무 작거나 addr이 사용자 주소 공간의 유효한 부분이 아닙니다.
WSAEINTR
차단 Windows 소켓 1.1 호출이 WSACancelBlockingCall을 통해 취소되었습니다.
WSAEINVAL
수신 대기 함수가 수락하기 전에 호출되지 않았습니다.
WSAEINPROGRESS
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEMFILE
큐는 입력 시 사용할 수 없으며 사용할 수 있는 설명자가 없습니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEOPNOTSUPP
참조된 소켓은 연결 지향 서비스를 지원하는 형식이 아닙니다.
WSAEWOULDBLOCK
소켓은 차단 해제로 표시되며 허용될 연결이 없습니다.

설명

accept 함수는 소켓의 보류 중인 연결 큐에서 첫 번째 연결을 추출합니다. 그런 다음 핸들을 만들어 새 소켓에 반환합니다. 새로 만든 소켓은 실제 연결을 처리하는 소켓입니다. WSAAsyncSelect 또는 WSAEventSelect 함수에 등록된 비동기 이벤트를 포함하여 소켓과 동일한 속성을 가짐

accept 함수는 큐에 보류 중인 연결이 없고 소켓이 차단으로 표시된 경우 연결이 있을 때까지 호출자를 차단할 수 있습니다. 소켓이 차단 해제로 표시되고 큐에 보류 중인 연결이 없는 경우 accept 는 다음 설명에 설명된 대로 오류를 반환합니다. 수락이 성공적으로 완료되면 새 소켓 핸들이 반환되면 허용되는 소켓을 사용하여 더 많은 연결을 허용할 수 없습니다. 원래 소켓은 열린 상태로 유지되며 새 연결 요청을 수신 대기합니다.

매개 변수 추가 는 통신 계층에 알려진 연결 엔터티의 주소로 채워진 결과 매개 변수입니다. addr 매개 변수의 정확한 형식은 통신이 발생하는 주소 패밀리에 의해 결정됩니다. addrlen은 값 결과 매개 변수입니다. 처음에는 addr가 가리키는 공간의 양을 포함해야 합니다. 반환하면 반환된 주소의 실제 길이(바이트)가 포함됩니다.

accept 함수는 SOCK_STREAM 같은 연결 지향 소켓 형식과 함께 사용됩니다. addr 및/또는 addrlenNULL과 같으면 허용되는 소켓의 원격 주소에 대한 정보가 반환되지 않습니다.

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

예제 코드

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

#include <winsock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <windows.h>

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

int wmain(void)
{

    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket 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.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_port = htons(27015);
    inet_pton(AF_INET, "127.0.0.1", &service.sin_addr);

    if (bind(ListenSocket,
             (SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) {
        wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 1) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Create a SOCKET for accepting incoming requests.
    SOCKET AcceptSocket;
    wprintf(L"Waiting for client to connect...\n");

    //----------------------
    // Accept the connection.
    AcceptSocket = accept(ListenSocket, NULL, NULL);
    if (AcceptSocket == INVALID_SOCKET) {
        wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    } else
        wprintf(L"Client connected.\n");

    // No longer need server socket
    closesocket(ListenSocket);

    WSACleanup();
    return 0;
}


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

ATM에 대한 참고 사항

다음은 연결 설정과 관련된 중요한 문제이며 Windows 소켓 2와 함께 ATM(비동기 전송 모드)을 사용할 때 고려해야 합니다.

  • acceptWSAAccept 함수가 반드시 원격 주소 및 주소 길이 매개 변수를 설정하지는 않습니다. 따라서 ATM을 사용하는 경우 호출자는 WSAAccept 함수를 사용하고 WSAAccept에 따라 사용되는 콜백 함수의 lpSQOS 매개 변수에 포함된 QoS 구조체의 ProviderSpecific 멤버에 ATM_CALLING_PARTY_NUMBER_IE 배치해야 합니다.
  • accept 함수를 사용하는 경우 연결 설정이 발신자와 수신기 사이의 전체 거리를 트래버스하기 전에 함수가 반환될 수 있음을 인식합니다. 이는 accept 함수가 CONNECT ACK 메시지를 받는 즉시 를 반환하기 때문입니다. ATM에서 CONNECT ACK 메시지는 CONNECT 메시지가 처리되는 즉시 경로의 다음 스위치에 의해 반환됩니다(연결이 궁극적으로 설정된 최종 노드에서 전송되는 CONNECT ACK가 아니라). 따라서 애플리케이션은 CONNECT ACK 메시지를 받은 직후 데이터가 전송되는 경우 발신자와 수신자 간에 연결이 설정되지 않았을 수 있으므로 데이터 손실이 발생할 수 있음을 인식해야 합니다.

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

추가 정보

WSAAccept

WSAAsyncSelect

Winsock 함수

Winsock 참조

bind

connect

listen

선택

sockaddr

socket