Manpages

이 름

accept − 소 켓 에 연 결 을 받 아 들 인 다 .

사 용 법

#include <sys/types.h>
#include <sys/socket.h>

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

설 명

accept 함 수 는 연 결 -기 반 소 켓 타 입 에 (SOCK_STREAM, SOCK_SEQPACKET 그 리 고 SOCK_RDM) 사 용 된 다 . 이 것 은 미 결 인 연 결 들 을 위 한 큐 에 서 처 음 연 결 을 뽑 아 s와 거 의 같 은 특 성 을 갖 는 새 로 연 결 된 소 켓 을 만 든 다 . 그 리 고 소 켓 에 새 파 일 기 술 자 를 할 당 하 며 이 것 을 반 환 한 다 . 새 로 생 성 된 소 켓 은 더 이 상 기 다 리 는 (listen) 상 태 가 아 니 다 . 원 래 의 소 켓 s 는 이 시 스 템 콜 에 의 해 영 향 을 받 지 않 는 다 . 파 일 기 술 자 프 래 그 중 어 떤 것 은 (비 -봉 쇄 나 async 상 태 같 이 F_SETFL fcntl을 가 지 고 설 정 할 수 있 는 모 든 것 ) accept 를 통 해 상 속 되 지 않 는 다 .

인 자 ssocket(2)으 로 만 들 어 진 소 켓 이 며 , bind(2)로 로 컬 주 소 를 묶 고 listen(2)후 에 연 결 을 기 다 린 다 .

인 자 addr 는 sockaddr 구 조 체 에 대 한 포 인 터 이 다 . 이 구 조 체 는 통 신 층 (communication layer) 으 로 알 려 진 접 속 실 체 의 주 소 가 채 워 진 다 . addr 인 자 에 게 전 달 되 는 주 소 의 정 확 한 형 식 은 socket 가 족 ( socket(2)과 프 로 토 콜 맨 페 이 지 를 참 조 해 라 .) 에 의 해 결 정 된 다 . addrlen 인 자 는 값 -결 과 파 라 미 터 이 다 : 그 것 은 addr가 가 리 키 는 구 조 체 의 크 기 를 포 함 해 야 한 다 .;리 턴 시 그 것 은 반 환 된 주 소 의 실 제 길 이 (바 이 트 )를 포 함 한 다 . addr 가 NULL이 라 면 어 떤 것 도 채 워 지 지 않 는 다 .

만 일 미 결 인 연 결 들 이 큐 에 존 재 한 다 면 그 리 고 소 켓 이 비 -봉 쇄 로 써 표 시 되 지 않 았 다 면 , accept 는 연 결 이 존 재 할 때 까 지 호 출 자 를 봉 쇄 한 다 . 만 일 소 켓 이 비 -봉 쇄 이 고 미 결 인 연 결 들 이 큐 에 존 재 한 다 면 , accept 는 EAGAIN을 반 환 한 다 .

소 켓 에 들 어 오 는 연 결 들 을 인 식 하 기 위 해 , 여 러 분 은 select(2)poll(2)을 사 용 할 수 있 다 . 새 로 운 연 결 이 시 도 되 었 을 때 읽 기 가 능 한 이 벤 트 가 전 달 되 며 여 러 분 은 그 연 결 을 위 한 소 켓 을 가 지 기 위 해 accept 를 호 출 한 다 . 선 택 적 으 로 , 여 러 분 은 활 동 이 소 켓 에 서 일 어 났 을 때 SIGIO 를 전 달 하 기 위 해 소 켓 을 설 정 할 수 있 다 .; 세 부 사 항 을 위 해 서 는 socket(7)를 참 조 해 라 .

DECNet 같 이 명 쾌 한 승 인 을 요 구 하 는 프 로 토 콜 에 서 , accept 는 단 지 다 음 연 결 요 구 를 큐 에 서 빼 내 고 승 인 을 이 야 기 하 지 는 않 는 것 으 로 써 생 각 될 수 있 다 . 확 인 은 새 파 일 기 술 자 에 정 상 적 인 읽 기 나 쓰 기 에 의 해 알 수 있 으 며 거 절 은 새 소 켓 을 닫 음 으 로 써 알 수 있 다 . 현 재 단 지 DECNet만 이 리 눅 스 에 서 이 러 한 의 미 론 을 가 진 다 .

주 의

SIGIO 가 전 달 된 후 나 또 는 select(2)poll(2)가 읽 기 가 능 하 다 는 이 벤 트 를 반 환 한 후 항 상 연 결 을 기 다 리 는 것 은 아 니 다 . 왜 냐 하 면 accept 가 호 출 된 후 에 연 결 이 비 동 기 적 인 네 트 웍 에 러 나 다 른 쓰 레 드 에 의 해 제 거 될 수 도 있 기 때 문 이 다 . 이 런 일 이 발 생 한 다 면 호 출 은 도 착 하 는 다 음 연 결 을 기 다 리 며 봉 쇄 가 될 것 이 다 . accept 가 결 코 봉 쇄 되 지 않 는 다 는 것 을 보 장 하 기 위 해 , 전 달 된 소 켓 sO_NONBLOCK 플 래 그 설 정 을 가 져 야 한 다 .( socket(7)를 참 조 해 라 .)

반 환 값

에 러 시 −1이 반 환 된 다 . 만 일 성 공 한 다 면 , 받 아 들 인 소 켓 을 위 한 기 술 자 인 음 이 아 닌 정 수 를 반 환 한 다 .

에 러 HANDLING

Linux acceptaccept의 에 러 코 드 때 문 에 새 소 켓 에 이 미 미 결 인 네 트 웍 에 러 를 전 달 한 다 . 이 러 한 행 동 은 BSD 소 켓 수 행 과 는 다 르 다 . 신 뢰 적 인 작 동 을 위 해 응 용 프 로 그 램 은 accept 후 에 프 로 토 콜 에 정 의 된 네 트 웍 에 러 들 을 검 사 해 야 한 다 . 그 리 고 재 시 도 에 의 해 EAGAIN같 은 에 러 를 처 리 해 야 한 다 . TCP/IP의 경 우 , 이 것 들 은 ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, 그 리 고 ENETUNREACH 이 다 .

에 러

EAGAIN or EWOULDBLOCK

소 켓 이 비 -봉 쇄 로 표 시 되 었 고 어 떤 연 결 도 받 아 들 이 기 위 해 존 재 하 지 않 는 다 .

EBADF

기 술 자 가 유 효 하 지 않 다 .

ENOTSOCK

기 술 자 는 소 켓 이 아 니 라 파 일 을 가 리 킨 다 .

EOPNOTSUPP

가 리 키 는 소 켓 이 SOCK_STREAM타 입 이 아 니 다 .

EFAULT

addr 파 라 미 터 가 유 저 주 소 공 간 의 쓰 기 가 능 한 부 분 이 아 니 다 .

EPERM

방 화 벽 규 칙 이 연 결 을 막 는 다 .

ENOBUFS, ENOMEM

여 유 메 모 리 가 충 분 하 지 않 다 . 이 것 은 메 모 리 할 당 이 시 스 템 메 모 리 에 의 해 서 가 아 니 라 소 켓 버 퍼 제 한 값 에 의 해 제 한 되 었 다 는 것 을 의 미 하 며 100%일 치 하 지 는 않 는 다 .

게 다 가 , 새 소 켓 과 프 로 토 콜 을 위 해 정 의 된 네 트 웍 에 러 들 이 반 환 된 다 . 다 양 한 리 눅 스 커 널 은 EMFILE, EINVAL, ENOSR, ENOBUFS, EPERM, ECONNABORTED, ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT, ERESTARTSYS 같 은 다 른 에 러 들 을 반 환 할 수 있 다 .

호 환

SVr4, 4.4BSD ( accept 함 수 는 BSD 4.2에 서 처 음 나 타 났 다 .) BSD 맨 페 이 지 는 다 섯 개 (EBADF, ENOTSOCK, EOPNOTSUPP, EWOULDBLOCK, EFAULT)의 반 환 가 능 한 에 러 들 을 문 서 화 했 다 . SUSv2 는 EAGAIN, EBADF, ECONNABORTED, EFAULT, EINTR, EINVAL, EMFILE, ENFILE, ENOBUFS, ENOMEM, ENOSR, ENOTSOCK, EOPNOTSUPP, EPROTO, EWOULDBLOCK 에 러 들 을 문 서 화 했 다 .

주 의

accept 의 세 번 째 인 자 는 원 래 ’int *’(그 리 고 libc4 그 리 고 libc5 그 리 고 BSD 4.*, SunOS 4, SGI 같 은 많 은 다 른 시 스 템 에 서 )로 선 언 되 었 다 .; POSIX 1003.1g 표 준 초 안 은 이 타 입 을 ’size_t *’으 로 그 리 고 SunOS 5에 서 이 렇 게 바 꾸 길 원 했 다 . POSIX 초 안 이 ’socklen_t *’이 된 후 Single Unix Specification과 glibc2는 이 렇 게 하 였 다 . 리 누 스 토 발 즈 의 말 을 인 용 하 면 : _Any_ sane library _must_ have "socklen_t" be the same size as int. 그 밖 의 것 들 은 BSD 소 켓 층 을 막 는 다 . POSIX는 _did_를 size_t로 만 들 었 으 며 나 는 (그 리 고 너 무 많 지 는 않 지 만 다 른 사 람 들 ) 실 제 로 매 우 불 만 족 스 럽 다 . size_t는 매 우 문 제 가 있 다 . 왜 냐 하 면 size_t는 64-비 트 아 키 텍 쳐 에 서 "int"처 럼 거 의 같 은 크 기 가 아 니 기 때 문 이 다 . 그 리 고 그 것 은 "int"처 럼 같 은 크 기 를 가 져 야 한 다 . 왜 냐 하 면 BSD 소 켓 인 터 페 이 스 가 그 렇 기 때 문 이 다 . 어 쨋 든 , POSIX 사 람 들 은 결 국 계 기 를 가 지 고 "socklen_t"를 만 들 었 다 . 그 들 은 처 음 위 치 에 서 는 건 들 지 는 않 았 지 만 일 단 그 들 은 고 쳤 고 그 것 이 몇 몇 이 해 할 수 없 는 이 유 때 문 에 타 입 이 라 는 이 름 을 가 져 야 한 다 는 것 을 느 꼈 다 . (아 마 누 군 가 는 원 래 어 리 석 은 일 을 하 는 것 이 상 으 로 얼 굴 팔 리 는 것 을 좋 아 하 지 않 는 다 . 그 리 서 그 들 은 조 용 히 그 들 의 실 수 를 다 시 이 름 지 었 다 .)

관 련 항 목

bind(2), connect(2), listen(2), select(2), socket(2)

역 자

정 강 훈 <skyeyes [AT] soback.net>, 2000년 9월 19일