반응형
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 응용
반응형
'C언어 header > sys | socket.h' 카테고리의 다른 글
connect(2) - 서버로 접속하기 (0) | 2019.09.29 |
---|---|
accept(2) / accept4(2) - client와 연결된 새로운 socket 생성 (0) | 2019.09.29 |
listen(2) - client가 접속할 수 있도록 준비 작업 (0) | 2019.09.29 |
struct sockaddr - Address Family에 따른 구조체 (0) | 2019.09.29 |
socket(2) - socket 생성 (0) | 2019.09.29 |