ACCEPT(2)

명칭
accept - 소켓상의 접속을 받아들인다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/socket.h> int accept(int s, struct sockaddr *addr, socklen_t *addrlen)

해설
인수 s 하 socket(2) 그리고 작성되어 bind(2) 그리고 주소에 바인드 되어 listen(2) 도 끝마쳐 접속을 기다리고 있는 소켓입니다. accept() 호출은, 기다리는 행렬상의 최초의 접속 요구를 꺼내, s (와)과 같은 프로퍼티의 새로운 소켓을 작성해, 소켓을 위한 새로운 파일 기술자를 할당합니다. 접속 요구가 기다리는 행렬상에 존재하지 않고, 게다가 소켓이 비블로킹과 마크되어 있지 않은 경우, accept() (은)는 접속 요구가 있을 때까지 호출측을 블록 합니다. 소켓이 비블로킹과 마크 되고 있어 게다가 기다리는 행렬에 접속 요구가 존재하지 않는 경우, accept() (은)는 후술과 같이 에러를 돌려줍니다. 접속이 성립한 소켓은, 그 이상의 접속을 받아들이기 위해서(때문에) 사용할 수 없습니다. 오리지날의 소켓 s (은)는 연대로 입니다.

인수 addr (은)는 결과 파라미터로, 통신 레이어에 기존의 접속 엔티티의 주소로 묻을 수 있습니다. addr 파라미터의 정확한 형식은 통신이 행해지는 도메인으로 정해집니다. addrlen (은)는, 「값 - 결과」파라미터입니다. 이것은 처음은 addr 하지만 가리키는 공간의 사이즈를 포함하지 않으면 안됩니다. 귀가시에는, 돌려주어지는 주소의 실제의 길이 (바이트 단위)를 포함하게 됩니다. 이 호출은, connection를 베이스로 한 소켓 타입, 현재는 SOCK_STREAM (와)과 함께 사용됩니다.

읽기로 소켓을 select(2) 하는 것에 의해, accept() 하는 소켓을 선택할 수가 있습니다.

ISO 또는 DATAKIT (와)과 같이 명료한 확인이 필요한 특정의 프로토콜에서는, accept() (은)는 단지 다음의 접속 요구를 기다리는 행렬로부터 제외한 것만으로, 확인은 실시하지 않는다고 생각됩니다. 확인은, 새로운 파일 기술자에 대한 통상의 읽기 또는 기록에 의해 실시할 수가 있어 거절은 새로운 소켓을 닫는 일에 의해 실현될 수 있습니다.

어떤 종류의 어플리케이션에 대해서는, 내향의 접속을 accept_filter(9) 그리고 사전 처리 하는 것으로써, 성능이 향상할지도 모릅니다.

반환값
시스템 콜은 에러가 있었을 경우 -1 를 돌려줍니다. 처리가 정상적으로 완료했을 경우, 받아들인 소켓의 기술자인 비부정수를 돌려줍니다.

에러
accept() (은)는 다음의 경우에 실패합니다:

[EBADF]
    기술자가 유효하지는 않습니다.

[EINTR]
    accept() 조작이 끼어들어졌습니다.

[EMFILE]
    프로세스의 기술자 테이블이 만배입니다.

[ENFILE]
    시스템 파일 테이블이 만배입니다.

[ENOTSOCK]
    기술자가 파일을 참조하고 있어 소켓이 아닙니다.

[EINVAL]
    listen(2) 하지만 소켓 기술자에 대해서 불려 가고 있지 않습니다.

[EFAULT]
    addr 파라미터가 유저 address 공간의 기록 가능한 부분에 없습니다.

[EWOULDBLOCK]
    소켓이 비블로킹과 마크 되어 한층 더 받아들여야 할 접속 요구가 존재하지 않습니다.

[ECONNABORTED]
    접속 요구가 도착했습니다만, 기다리는 행렬로 대기하고 있다 사이에 닫아 버렸습니다.

관련 항목
accept_filter(9), bind(2), connect(2), getpeername(2), listen(2), select(2), socket(2)

역사
accept() 함수는 4.2BSD 그리고 등장했습니다.