bind( ) 함수

#include <sys/socket/h>

int bind(int sockfd, struct sockaddr *myaddr, socklen_t adrlen);

// sockfd : 소켓
// myaddr : IP, Port 정보
// adrlen : myaddr의 길이

socket() 을 통해 두 컴퓨터간에 데이터 전송 방식을 설정했다.

bind() 를 통해 socket() 에 IP 주소와  Port 번호를 할당해 위치를 식별하기 위해 필요한 정보는 아래와 같다.

IP는 컴퓨터를 구분하기 위한 목적으로 존재한다.

Port는 프로그램의 소켓을 구분하기 위해 존재한다.

Q1. 어떤 주소 체계를 사용하나요?    >>    IPv4
Q2. IP 주소가 어떻게 되나요?          >>    211.204.214.76
Q3. Port 번호가 어떻게 되나요?       >>    2048

이 정보를 sockaddr_in 구조체에 정의하여 bind( ) 함수의 매개변수로 대입한다.

sockaddr_in 구현

sockaddr_in 구조체 구조

struct sockaddr_in
{
    sa_family_t        sin_family;  // 주소체계(Address Family)
    uint16_t           sin_port;    // 16 비트 TCP/UDP PORT 번호
    struct in_addr     sin_addr;    // 32 비트 IP주소
    char               sin_zero[8]; // 사용되지 않음
}

// sin_ prefix means sockaddr_in
// ai_ prefix means addrinfo
// sa_ prefix means sockaddr

sa_family_t sin_family

* AF stands for "Address Format, Internet = IP Addresses."

uint16_t sin_port

▶ 클라이언트에서 bind( )를 호출할 필요가 없는 이유는, 클라이언트 프로그램은 서버 프로그램과 달리 자신이 사용하는 IP 주소나 포트번호를 다른 클라이언트 또는 서버가 미리 알고 있을 필요가 없기 때문이다.

▶ 서버의 응용 프로그램은 자신이 사용하고 있는 포트번호를 통하여 클라이언트들의 서비스를 처리해야 하므로, 응용 프로그램이 소켓번호와 소켓주소를 bind( )하는 것이 필수적이다.

▶ 클라이언트는 포트번호를 임의로 사용해도 되기 때문에 포트번호를 특정한 값으로 bind()시켜 두는 것이 필요 없고, 같은 포트번호를 사용하는 클라이언트 프로그램들이 하나의 컴퓨터에서 두 개 이상 실행되면 에러가 발생한다.

struct in_addr sin_addr

struct in_addr
{
    in_addr_t         s_addr;      // 32 비트 IPv4 인터넷 주소
}

// S_ prefix means struct 
// s usually means "sock" short for "socket"
// _t POSIX style

char sin_zero[8]

sockaddr _in 의 크기를 구조체 sockaddr와 일치시키기 위해 삽입된 멤버이다 . 반드시 0으로 채워야 한다.

struct sockaddr

struct sockaddr
{
	sa_family_t  sin_family;   //   주소체계(Address Family)
	char         sa_data[14];  //   주소정보
};

출처 & 참고

1. 윤성우 열혈 TCP IP 소켓 프로그래밍 Ch. 03

ubiquitous4g