Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=bind">bind</a>(2)

1장. bind(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

소켓에 특성을 부여(정의)한다.


1.1절. 사용법

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

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


1.2절. 설명

sockfd 는 socket(2) 함수를 통해서 만들어진 소켓지정번호이다. bind 는 이 sockfd 에 my_addr 로 대변되는 특성을 부여한다. my_addr 에는 sockfd 가 통신을 하기 위해서 필요한 정보인 "port", "인터넷주소", "소켓 흐름종류" 등을 포함하고 있다.


1.3절. 반환값

성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.


1.4절. 에러

다양한 원인에 의해서 에러가 발생할수 있으며 아래와 같은 에러 메시지들이 있다.

EBADF

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

EACCES

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

ENOTSOCK

sockfd 가 소켓지정자가 아닌 파일지정자이다.

EROFS

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

ENOENT

sockfd 가 존재하지 않는다.


1.5절. 예제

#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

int main()
{
    int sockfd;
    int client_sockfd;
    int client_len;
    int state;
    struct sockaddr_in clientaddr, serveraddr, myaddr;

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(12345);


    state = bind(sockfd , (struct sockaddr *)&serveraddr,
            sizeof(serveraddr));
    if (state == -1)
    {
        perror("bind error : ");
        exit(0);
    }
    
    state = listen(sockfd, 5);
    if (state == -1)
    {
        perror("listen error : ");
        exit(0);
    }
    client_len = sizeof(clientaddr);
    client_sockfd = accept(sockfd, (struct sockaddr *)&clientaddr,
                            &client_len);

    getpeername(client_sockfd, (struct sockaddr *)&myaddr, &client_len);

    printf("Port : %d\n", myaddr.sin_port);
    printf("address : %s\n", inet_ntoa(myaddr.sin_addr));

    close(client_sockfd);
    close(sockfd);
    return 1;
}