내일배움캠프 Node.js 트랙 46일차
소켓 프로그래밍
소켓이란?
소켓은 애플리케이션과 네트워크 사이의 인터페이스(연결부) 역할을 한다.(인터페이스: 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 접점이나 경계면) 애플리케이션은 소켓을 생성하고, 소켓의 타입에 의해 소통 방식이 결정된다.(reliable vs. best effort / connection-oriented vs. connectionless)
처음 소켓이 설정되면, 애플리케이션은 네트워크 통신을 위해 데이터를 소켓으로 통과시킬 수 있게 된다. 이런 과정을 거쳐, 다른 호스트가 보낸 데이터를 소켓을 통해 전달 받게 되는 것이다.
(여담 : 애플리케이션 계층에서 소켓 통신을 하는 이유는 전송 계층의 프로토콜에 따라야 하기 때문이다.)
소켓의 종류
소켓에는 두 가지 중요한(Essential) 타입이 존재한다. 그 유명한 TCP와 UDP이다.
(1) SOCK_STREAM(소켓 스트림) => TCP
- reliable delivery
- 순서 보장
- 연결 지향성
- 양방향 통신
(2) SOCK_DGRAM(소켓 데이터그램) => UDP
- unreliable delivery
- 순서 보장하지 않음
- 연결에 대한 개념이 존재하지 않음(애플리케이션은 각 데이터그램마다 도착지 정보를 가르쳐줄 뿐)
- 송수신이 가능하지만 독립적인 데이터그램 단위에서 이루어진다.(연결이 이루어지는 TCP의 양방향 통신과는 조금 다름)
소켓 API 실행 흐름
(출처 : KOCW <컴퓨터 네트워크> 강의를 들으면서 강의 내용을 figma로 제작하였습니다.)
소켓 생성(C 언어 기반)
- Include file
<sys/socket.h>
- 소켓 프로그래밍에 필요한 헤더 파일
<sys/socket.h>
를 포함해야 한다.
- 소켓 프로그래밍에 필요한 헤더 파일
- Create a socket (소켓 생성)
- 소켓을 생성하는 함수의 형태:
int socket(int domain, int type, int protocol);
- domain: 주소 체계(예: IPv4를 위한
AF_INET
). - type: 소켓 타입(예:
SOCK_STREAM
은 TCP,SOCK_DGRAM
은 UDP). - protocol: 사용하고자 하는 프로토콜(일반적으로 0으로 설정하여 기본 프로토콜 사용).
- domain: 주소 체계(예: IPv4를 위한
- 반환값: 파일 디스크립터(file descriptor) 또는 실패 시 -1 반환.
- 소켓을 생성하는 함수의 형태:
- Bind a socket (소켓 바인딩)
- 소켓 바인딩 함수:
int bind(int sockfd, struct sockaddr* myaddr, int addrlen);
- sockfd: 소켓 파일 디스크립터.
- myaddr: 바인딩할 IP 주소와 포트를 포함하는 구조체.
- addrlen: 주소 구조체의 크기.
- 소켓을 로컬 IP 주소와 포트 번호에 바인딩한다.
- 소켓 바인딩 함수:
- Put socket into passive state (소켓을 수동 상태로 설정)
- 함수:
int listen(int sockfd, int backlog);
- sockfd: 소켓 파일 디스크립터.
- backlog: 대기열에 저장할 최대 연결 요청 수.
- 소켓을 수동 대기 상태로 설정하여 연결 요청을 수신할 준비를 한다.
- 함수:
- Accept connections (연결 수락)
- 함수:
int accept(int sockfd, struct sockaddr* cliaddr, int* addrlen);
- sockfd: 소켓 파일 디스크립터.
- cliaddr: 클라이언트의 주소 정보를 저장하는 구조체.
- addrlen: 주소 구조체의 크기를 나타내는 포인터.
- 클라이언트 연결 요청을 수락하며, 새로운 파일 디스크립터를 반환하거나 실패 시 -1을 반환한다.
- 함수:
=> 소켓 연결 수립은 다음 게시글에서 계속…
'개발일지 > TIL(Today I Learned)' 카테고리의 다른 글
2025-01-06 <프로토콜 버퍼를 이용한 TCP 서버 통신> (1) | 2025.01.06 |
---|---|
2025-01-03 (0) | 2025.01.03 |
2024-12-31 (0) | 2024.12.31 |
2024-12-30 (0) | 2024.12.30 |
2024-12-27 (1) | 2024.12.27 |
댓글