accept

accept 함수는 소켓(리슨소켓)으로 들어오는 접속요청을 허용하는 함수입니다.

SOCKET accept (
        SOCKET
s,
        struct sockaddr FAR*
addr,
        int FAR*
addrlen
);

 

Parameters

s
[입력]
listen 함수에 의해서 접속대기 하고 있는 소켓(일반적으로 리슨소켓 이라고 하죠.) 의 기술자(descriptor) 입니다.

addr
[출력] 연결의 다른 쪽 끝에 있는 원격 호스트의 어드레스를 포인트 합니다.

addrlen
[출력] addr 매개변수에 의해 포인트된 버퍼의 길이를 나타내는 정수를 포인트 합니다.

 

Remarks

리슨소켓에 도착한 연결요청은 접속대기 큐에 쌓여집니다. accept 함수는 접속대기 큐에 있는 첫 번째 접속을 뽑아냅니다. 그런다음 새로운 소켓을 생성하고, 새로운 소켓의 핸들을 반환합니다. 새로 생성된 소켓은 같이 연결된소켓(WSAAsyncSelectWSAEventSelect 함수로 비동기적인 이벤트가 등록된 소켓임)과 실제적으로 접속이 된 소켓핸들입니다. accept 함수로 접속요청을 이루어 내게 되면, 이 새로운 소켓은 리슨 소켓의 그룹 아이디를 가지지 않게 됩니다.

accept 함수는 만약 큐에 접속을 기다리는(pending connections) 항목이 없고, 소켓이 블록킹(동기) 소켓으로 마킹되어 있다면, 접속할 때까지 caller를 블록킹 상태가 되게 할 수 있습니다. 만약 소켓이 넌블록킹(비동기) 소켓으로 되어 있고, 큐에 대해 기다리는 접속(pending connections)이 없다면, accept 함수는 에러를 반환 합니다. accept는 성공적인 수행후에 새로운 소켓핸들을 반환합니다. 접속이 허용된 새로운 소켓은 접속요청한 소켓과 실제적으로 연결이 된 소켓이지 달리 생성되는 리슨소켓이 아닙니다. 원래 리슨 소켓은 다시 다른 접속요구를 개방하고, 리슨 하기위해 남겨집니다.

addr 매개변수는 접속주소로 채워진 결과를 담고 있습니다. addr 매개변수의 포맷은 통신이 발생한 주소 패밀리를 결정합니다. addrlen 매개변수는 addr에 의해 포인트된 버퍼의 길이를 나타내는 정수(바이트)로 포인트 합니다.

accept 함수는 SOCK_STREAM 과 같은 연결지향형 소켓 타입에 사용됩니다.

만약 addr이나 addrlen 매개변수가 NULL 이라면, 접속된 소켓의 원격지 주소에대한 정보를 반환하지 않습니다.

Windows CE : Windows CE 에서는 WSAEINTR 에러 코드를 지원하지 않습니다.

IrSocket을 구현 할 때는 addr, addrlen 매개변수는 항상 NULL 이여야 합니다.

 

Return Values

에러가 발생하지 않는다면, 새로운 소켓의 기술자(descriptor)를 가지고 있는 SOCKET(u_int) 형태의 값을 리턴합니다. 이 리턴값은 실제적으로 원격지와 연결되어 있는 소켓의 핸들입니다.

에러가 발생한 경우 INVALID_SOCKET 이라는 값이 리턴되고, 특정한 에러코드는 WSAGetLastError 함수에 의해 얻을 수 있습니다.

 

Error Codes

WSANOTINITIALISED

이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.

WSAENETDOWN

네트웍 서브 시스템에 에러가 발생했습니다.

WSAEFAULT addrlen 매개변수가 너무 작거나, addr 매개변수가 올바르지 않습니다.
WSAEINTR 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEINPROGRESS

블럭킹 윈속 v1.1 이 현재 진행 중이거나, 서비스 프로바이더가 콜백 함수를 여전히 처리하고 있습니다.

WSAEINVAL accept 하기 전에 listen 함수가 불려지지 않았습니다.
WSAEMFILE 새로운 소켓에 할당하기 위한 소켓 기술자가 더 이상 남아있지 않습니다.
WSAENOBUFS 사용할 수 있는 버퍼 공간이 남아있지 않습니다.
WSAENOTSOCK 기술자(descriptor)가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP socket이 연결지향형 서비스(SOCK_STREAM)형태가 아닙니다.
WSAEWOULDBLOCK socket이 비동기 적으로 마킹되어 있고, 접속이 허용되지 않았습니다.

 

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 버젼 1.0 그리고 그이후의 버젼에서 사용가능
Header :
          Win16/32 : winsock.h
          Win32-II : winsock2.h
Import Library :
          Win16 : winsock.lib
          Win32 : wsock32.lib
          Win32-II : ws2_32.lib

See Also

overview, bind, connect, listen, select, socket, WSAAsyncSelect, WSAAccept