이 름
connect − 소 켓 연 결 을 시 작 한 다 .
사 용 법
#include
<sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
설 명
파 일 기 술 자 sockfd 는 소 켓 을 가 리 켜 야 한 다 . 만 일 소 켓 이 SOCK_DGRAM 타 입 이 라 면 serv_addr 주 소 는 기 본 적 으 로 보 낸 데 이 터 그 램 의 주 소 이 며 받 은 데 이 터 그 램 의 유 일 한 주 소 이 다 . 만 일 소 켓 이 SOCK_STREAM 나 SOCK_SEQPACKET이 라 면 , 함 수 는 다 른 소 켓 에 대 한 연 결 을 만 든 다 . 다 른 소 켓 은 serv_addr에 의 해 명 시 되 며 , 이 것 은 소 켓 의 통 신 공 간 에 있 는 주 소 ( addrlen길 이 ) 이 다 . 각 각 의 통 신 공 간 들 은 자 신 의 방 식 대 로 serv_addr 인 자 를 해 석 한 다 .
일 반 적 으 로 , 연 결 지 향 프 로 토 콜 소 켓 들 은 성 공 적 으 로 한 번 에 connect 한 다 ; 비 연 결 지 향 프 로 토 콜 소 켓 들 은 이 것 들 의 관 련 사 항 을 바 꾸 기 위 해 여 러 번 connect 를 사 용 한 다 . 비 연 결 지 향 소 켓 들 은 sockaddr 의 sa_family 멤 버 가 가 지 고 있 는 주 소 를 AF_UNSPEC으 로 설 정 하 고 연 결 하 여 관 련 사 항 들 을 없 앤 다 .
반 환 값
만 일 연 결 이 나 바 인 딩 이 성 공 한 다 면 , 0이 반 환 된 다 . 에 러 시 , −1이 반 환 되 며 errno 는 적 당 한 값 으 로 설 정 된 다 .
에 러
다 음 것 을 은 단 지 일 반 적 소 켓 에 러 들 이 다 . 여 기 에 는 다 른 도 메 인 에 의 존 한 에 러 들 이 있 을 수 있 다 .
EBADF |
파 일 기 술 자 가 기 술 자 테 이 블 에 있 는 유 효 한 인 덱 스 가 아 니 다 . | ||
EFAULT |
소 켓 구 조 체 주 소 가 사 용 자 의 주 소 공 간 외 에 있 다 . |
ENOTSOCK
파 일 기 술 자 가 소 켓 과 관 련 되 어 있 지 않 다 .
EISCONN
소 켓 이 이 미 연 결 되 어 있 다 .
ECONNREFUSED
원 격 주 소 에 대 해 기 다 리 고 있 는 것 이 하 나 도 없 다 .
ETIMEDOUT
연 결 시 도 중 타 임 아 웃 이 발 생 했 다 . 서 버 는 너 무 busy 상 태 이 어 서 새 연 결 을 받 아 들 일 수 없 다 . IP 소 켓 에 서 동 기 화 가 서 버 에 서 가 능 할 경 우 매 우 오 래 걸 린 다 는 점 을 주 의 해 라 .
ENETUNREACH
네 트 워 크 에 도 달 할 수 없 다 .
EADDRINUSE
로 컬 주 소 가 이 미 사 용 중 이 다 .
EINPROGRESS
소 켓 이 비 -블 럭 킹 이 며 연 결 이 즉 시 완 성 될 수 없 다 . 쓰 기 를 위 해 소 켓 을 선 택 하 여 연 결 완 성 을 위 해 서 select(2)나 poll(2)으 로 가 능 하 다 . select 가 쓰 기 가 능 을 가 리 킨 후 , connect 이 성 공 적 (SO_ERROR 는 0이 다 )으 로 끝 났 는 지 아 닌 지 (SO_ERROR 는 실 패 에 대 한 이 유 를 설 명 하 면 서 여 기 에 서 나 열 된 보 통 의 에 러 조 건 들 중 하 나 이 다 .) 를 결 정 하 기 위 해 서 SOL_SOCKET 레 벨 의 SO_ERROR 옵 션 을 읽 기 위 해 getsockopt(2)을 사 용 해 라 .
EALREADY
소 켓 이 비 -블 럭 킹 이 고 전 연 결 시 도 가 아 직 완 전 하 지 않 다 .
EAGAIN |
사 용 할 수 있 는 로 컬 포 트 가 더 이 상 없 거 나 라 우 팅 캐 싱 에 엔 트 리 가 충 분 하 지 않 다 . PF_INET 시 로 컬 포 트 의 수 를 중 가 시 키 기 위 해 서 는 ip(7)에 있 는 net.ipv4.ip_local_port_range sysctl을 참 고 해 라 . |
EAFNOSUPPORT
전 달 된 주 소 가 sa_family 필 드 에 있 는 정 확 한 주 소 가 족 을 가 지 고 있 지 않 다 .
EACCES, EPERM
사 용 자 가 소 켓 브 로 드 캐 스 트 플 래 그 를 가 능 하 게 하 지 않 고 주 소 를 브 러 드 캐 스 트 주 소 에 연 결 할 려 고 시 도 했 거 나 로 컬 방 화 벽 규 칙 때 문 에 연 결 요 구 가 실 패 했 다 .
호 환
SVr4, 4.4BSD ( connect 함 수 는 BSD4.2에 서 처 음 나 타 났 다 .). SVr4는 추 가 적 으 로 일 반 적 에 러 조 건 들 EADDRNOTAVAIL, EINVAL, EAFNOSUPPORT, EALREADY, EINTR, EPROTOTYPE, 그 리 고 ENOSR를 문 서 화 했 다 . 여 기 서 기 술 하 지 않 은 많 은 추 가 적 에 러 조 건 들 돌 역 시 문 서 화 되 었 다 .
주 의
connect 의 세 번 쩨 인 자 는 실 제 로 int이 다 (그 리 고 이 것 은 BSD 4.*와 libc4, libc5가 가 지 고 있 다 .) 몇 몇 POSIX에 서 혼 란 은 socklen_t 때 문 이 다 . 표 준 은 아 직 채 택 되 지 않 았 지 만 glibc2는 이 미 그 것 을 따 르 고 있 고 또 한 socklen_t도 가 지 고 있 다 .
버 그
AF_UNSPEC 주 로 로 connect 를 호 출 하 여 소 켓 의 접 속 을 끝 는 것 은 아 직 수 행 되 지 않 는 다 .
관 련 항 목
accept(2), bind(2), listen(2), socket(2), getsockname(2)
역 자
정 강 훈 <skyeyes [AT] soback.net>, 2000년 7월 3일