BIND(2)

이름
bind - 소켓에 이름을 묶는다.

사용법
#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

설명
bind 는 소켓 sockfd 와 로컬 주소 my_addr를 준다. my_addr 는 long 형 addrlen 바이트이다. 전통적으로, 이것은 “이름을 소켓에 할당하기” 라고 불리어진다. 소켓이 socket(2)으로 생성되었을때, 그것은 이름 공간(address family)에 존재하지만 할당된 이름을 가지고 있는것은 아니다.

SOCK_STREAM 소켓이 연결들을 받기 전에 bind 를 사용하여 로컬 주소를 할당하는 것이 보통 필수적이다. accept(2)를 참조해라).

주의
이름 묶기시 사용되는 규칙들은 주소 가족(address families)들마다 다르다. 세부 사항을 위해서 Section 7에 있는 메뉴얼을 참조해라. AF_INET 를 위해서는 ip(7)를, AF_UNIX 를 위해서는 unix(7)를, AF_APPLETALK 를 위해서는 ddp(7)를, AF_PACKET 를 위해서는 packet(7)를, AF_X25 를 위해서는 x25(7)를 그리고 AF_NETLINK 를 위해서는 netlink(7)를 참고해라.

반환값
성공시, 0이 반환된다. 에러시, -1이 반환되며, errno 는 적당한 값으로 설정된다.

에러

EBADF
    sockfd 가 유효한 기술자가 아니다.

EINVAL
    소켓가 이미 묶여져 있다. 이것은 앞으로 바뀔것이다:세부 사항을 볼려면 linux/unix/sock.c 를 참고해라.

EACCES
    주소가 보호되어 있으며, 사용자는 슈퍼 유저가 아니다.

ENOTSOCK
    인자가 소켓이 아니라 파일을 위한 기술자이다.

다음 에러들은 UNIX 도메인 (AF_UNIX)소켓들을 위한 것들이다.:

EINVAL
    addrlen 가 잘못되거나, 소켓이 AF_UNIX 가족이 아니다.

EROFS
    소켓 아이노드가 읽기-전용 파일 시스템에 있다.

EFAULT
    my_addr 가 사용자가 접근할수 있는 조소 공간외를 가리키고 있다.

ENAMETOOLONG
    my_addr 가 너무 길다.

ENOENT
    파일이 존재하지 않는다.

ENOMEM
    이용할수 있는 커널 메모리가 충분하지 않다.

ENOTDIR
    경로 접두사 요소가 디렉토리가 아니다.

EACCES
    경로 접두사 요소에 대한 검색 허가권이 거부되었다.

ELOOP
    너무 많은 상징 연결들을 my_addr시에 만났다.

버그
투명한 프록시 옵션들은 기술되지 않았다.

호환
SVr4, 4.4BSD ( bind 함수는 BSD4.2에서 처음 나타났다.) SVr4는 추가적으로 EADDRNOTAVAIL, EADDRINUSE를,그리고 일반적 에러 조건들인 ENOSR 를, 그리고 Unix-도메인 에러 조건들인 EIO, EISDIR 그리고 EROFS 를 문서화 했다.

주의
bind 의 3번째 인자는 실제로 int이다.(그리고 이것은 BSD 4.* 와 libc4, libc5가 가지고 있는 것이다.) 몇몇 POSIX 들은 현재의 socklen_t 때문에 약간 혼란스럽다. 표준은 아직 채택되지 않았지만, glibc2는 이미 그것을 따르고 있고 또한 socklen_t를 가지고 있다. accept(2)를 참고해라.

관련 항목
accept(2), connect(2), listen(2), socket(2), getsockname(2), ip(7), socket(7)

역자
정강훈 <skyeyes@soback.kornet.net>, 2000년 7월 2일