본문 바로가기

정글캠프-WIL/C언어

[C언어] - bind() 함수


미리 보고 오면 좋은 함수들

[C언어] - socket() 함수


bind() 함수란?
소켓에 IP 주소와 포트 번호를 할당하는 함수
생성된 소켓(socket)에 이름표를 붙이는 역할

Why Used?

소켓을 socket() 함수를 통해 생성하면, 아직 주소(IP + PORT)가 없는 상태

이 상태에선 외부에서 해당 소켓에 접근이 불가능

함수 원형

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
매개변수 설명
sockfd socket()으로 생성한 소켓 파일 디스크립터
addr IP 주소 + 포트 번호를 담은 구조체
addrlen 구조체의 크기

- sockaddr 구조체

struct sockaddr {
    sa_family_t sa_family;  // 주소 체계 (IPv4, IPv6 등)
    char sa_data[14];       // 실제 주소 데이터
};

ⓐ. sa_family ( 주소 타입을 의미 )

의미
AF_INET IPv4
AF_INET6 IPv6
AF_UNIX 로컬 소켓

 

ⓑ. sa_data ( 실제 주소 정보 [IP + PORT 등] )

사람이 쓰기엔 너무 불편함 | 구조가 명확하지 않음
[ port | ip | 기타... ]
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>

int main() {
    struct sockaddr addr;
    memset(&addr, 0, sizeof(addr));

    addr.sa_family = AF_INET;

    // 포트 4000
    unsigned short port = htons(4000);
    memcpy(&addr.sa_data[0], &port, 2);

    // IP 127.0.0.1
    unsigned int ip = inet_addr("127.0.0.1");
    memcpy(&addr.sa_data[2], &ip, 4);

    return 0;
}

- sockaddr_in 구조체

sockaddr 구조체 대신 사용 (바이트 단위로 직접 조립)
sockaddr_in 구조체 (이미 조립되어 있어 사용하기만 하면 되는 구조체)
struct sockaddr_in {
    sa_family_t sin_family;   // 주소 체계 (AF_INET)
    uint16_t sin_port;        // 포트 번호
    struct in_addr sin_addr;  // IP 주소
    char sin_zero[8];         // padding
};
// bind 함수는 sockaddr 구조체로 매개변수가 고정되어 있어 실제로 아래와 같이 캐스팅 해서 사용
struct sockaddr_in addr;
bind(sock, (struct sockaddr*)&addr, sizeof(addr));

return (반환 값)

성공 : 0

실패 : -1

헤더 파일

#include <sys/socket.h>

사용 예시

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

int main() {
    int sock;
    struct sockaddr_in addr;

    // 1. 소켓 생성
    sock = socket(AF_INET, SOCK_STREAM, 0);

    // 2. 주소 구조체 초기화
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;              // IPv4
    addr.sin_port = htons(4000);            // 포트 번호
    addr.sin_addr.s_addr = htonl(INADDR_ANY); // 모든 IP 허용

    // 3. bind
    if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
        printf("bind error\n");
        exit(1);
    }

    printf("bind 성공!\n");
    return 0;
}

다음으로 공부해야 할 것

[C언어] - listen() 함수

 

 

 

'정글캠프-WIL > C언어' 카테고리의 다른 글

[C언어] - va_list 자료형  (1) 2026.04.25
[C언어] - connect() 함수  (0) 2026.04.23
[C언어] - accept() 함수  (0) 2026.04.23
[C언어] - listen() 함수  (0) 2026.04.23
[C언어] - socket() 함수  (0) 2026.04.23