소켓에 주소 설정
- 소켓에 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 주소를 변환하는 함수는 여러개가 있다.
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 |