CONNECT(2)

이름
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@soback.kornet.net>, 2000년 7월 3일