bind(2)

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

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

socket(2)으로 생성한 sockfd에 주소를 설정하는 시스템콜 함수입니다. bind(2)함수는 주로 server socket에 사용하여 client에서 접속할 수 있는 주소를 설정합니다. client socket에서도 주소 설정으로 사용할 수 있습니다. 두번째 파라미터인 struct sockaddr 구조체는 기본적인 틀을 가진 구조체이고 Address Family에 따라서 별도의 구조체를 가지고 있습니다. (참고 : struct sockaddr - Address Family에 따른 구조체)

 

 

파라미터

sockfd
    - socket(2)함수를 통하여 생성한 socket descriptor입니다.
    - scoket(2)함수가 -1을 return하지 않았을 때에 return된 값입니다.
addr
    - socket에 설정할 주소 정보에 대한 struct입니다.

 struct sockaddr는 socket을 지원하는 Protocol의 기본 골격에 대한 sturct 이며, 
      AF_* (Address Family)에 따라서 struct를 다르게 정의하여 사용합니다.

 struct sockaddr {
     sa_family_t sa_family;
     char        sa_data[14];
 };
 로 sa_family에 AF_*값을 설정하고 AF_*값에 따라서 sa_data의 구조가 다릅니다.
 따라서 AF_*값에 따라서 구조체를 재정의하여 사용하며, Address Family에 따라서 char sa_data[14]; 
 즉, 14 바이트보다 큰 경우가 있으므로 사실상 struct sockaddr은 의미가 없는 구조체입니다.
addrlen
    - AF_* (Address Family)에 따라서 다르게 정의한 struct의 크기입니다.

 

RETURN

-1이 아님
    - 정상적으로 주소가 설정 되었습니다.

-1
    - 오류가 발생하였으며, 상세한 오류는 errno에 저장됩니다.
 EACCES     : root 권한이 없어서 Access할 수 없습니다.
 EADDRINUSE : 이미 사용중인 주소입니다.
 EBADF      : sockfd가 유효하지 않는 descriptor입니다.
 EINVAL     : socket이 이미 다른 주소가 bind되었습니다.
              또는 addrlen가 잘못되었거나 domain에 맞지 않는 주소 체계입니다.
 ENOTSOCK   : sockfd는 socekt이 아닙니다.
 
  - AF_UNIX socket관련 오류 -
 EACCES     : path에 대한 접근 권한이 없습니다.
 EADDRNOTAVAIL : 주소(파일 path)가 올바르지 않습니다. 
 EFAULT     : 사용자가 접근 가능한 주소 공간이 아닙니다. 
 ELOOP      : file path를 찾아 가는 데, 너무 많은 symbolic link가 있습니다.
 ENAMETOOLONG : 주소(file pull path)가 너무깁니다.
 ENOENT     : 존재하지 않는 path입니다..
 ENOMEM     : 사용할 수 있는 kernel memory 부족합니다.
 ENOTDIR    : path prefix가 directory가 아닙니다.
 EROFS      : Read only file system입니다.

 


활용 예제

 

Sample. TCP 서버 socket 주소 bind

#include <string.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>

#define SERVER_PORT    6905

    ......
    
    int    server_fd;
    struct sockaddr_in server;

    if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fprintf(stderr, "socket create error: %s\n", strerror(errno));
        return -1;
    }

    memset(&server, 0x00, sizeof(struct sockaddr_in));
    server.sin_family      = AF_INET;
    server.sin_port        = htons(SERVER_PORT);
    server.sin_addr.s_addr = INADDR_ANY;

    if(bind(server_fd, (const struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {
        fprintf(stderr, "socket create error: %s\n", strerror(errno));
        return -1;
    }
    
    ......

 


see also : Socket 통신과 Socket 응용

 

 

 

 

블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요