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]; // 주소정보
};
출처 & 참고