[Linux Socket] Server - bind() 함수[2]

소켓에 주소 설정

- 소켓에 IP Adress / Port 번호 정보 연결

#include <netdb.h>
#include <arpa/inet.h>

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

 

매개 변수

1) sockfd

주소 정보를 할당할 소켓의 파일 디스크립터

※ 파일 디스크립터: Linux가 파일을 구분하기 위해 배정한 번호

 

2) addr

프로토콜 버전(IPv4/IPv6), IP 주소, Port 번호 정보를 담고 있는 sockaddr 구조체 포인터

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(atoi("9090"));
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

// (struct sockaddr*)&serv_addr

 

IP 주소와 Port 번호는 바로 sockaddr 구조체 멤버 변수에 대입하지 않는다.

sockaddr_in 구조체에 넣고 sockaddr 구조체로 변환한다.

 


➡️ 사람이 사용하기 쉬운 형식의 sockaddr_in 구조체로 주소 정보를 받고

➡️ 실제로 저장하기 위해 사람이 사용하기 불편한 형식의 sockaddr 구조체로 변환한다.

※  sockaddr 구조체의 단점으로 sockaddr_in 구조체 멤버 변수를 무조건 0으로 초기화 후 값을 저장한다.

 

 SOCKADDR와  SOCKADDR_IN에 대해 알아보기


IP 주소는 문자열이지만  in_addr 구조체의 s_addr 멤버에 저장할 때는 정수형으로 변환해서 저장해야 한다.

IP 주소를 변환하는 함수는 여러개가 있다.

 

IP 주소 변환 함수에 대해 알아보기


 

3) addrlen

sockaddr 구조체 크기

 

 

Bind 함수 호출 결과 

- 성공시 0, 실패 시 -1

#include <cstdio>
#include <stdlib.h>
#include <netdb.h>
#include <memory.h>
#include <arpa/inet.h>

int main()
{
    int socket, status;
    struct sockaddr_in serv_addr;

    // 1. Socket 생성
    int socket = socket(AF_INET, SOCK_STREAM, 0);

    if (socket == -1) {
        exit(1);
    }

    // 2. 주소정보 저장
    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi("9090"));
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    // 3. 저장된 주소 정보를 소켓에 등록
    status = bind(socket, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    
    if (status == -1) {
        exit(1);
    }

    return 0;
}

'Network > Socket' 카테고리의 다른 글

🔖IP 주소 변환 함수  (0) 2023.05.09
🔖SOCKADDR VS SOCKADDR_IN  (0) 2023.05.09
🔖 SOCK_STREAM VS SOCK_DGAM  (0) 2023.05.04
[Linux Socket] Server - socket() 함수[1]  (0) 2023.05.03
소켓(SOCKET)이란?  (0) 2023.05.03