리다이렉션(Redirection)은 명령어의 출력을 터미널이 아닌 다른 곳으로 보내는 기능이다. 일반적으로는 파일로의 출력이나, 파일로부터의 입력을 처리하는 데 사용된다.
사용의 예로, 소켓을 통해 수신된 데이터를 파일로 저장하거나, 파일의 데이터를 소켓을 통해 전송할 때 리다이렉션을 사용할 수 있다.
> : 명령어의 출력을 파일로 전송한다. 이미 존재하는 파일인 경우 내용을 덮어쓴다.
예: ls > filelist.txt는 현재 디렉토리의 파일 목록을 filelist.txt 파일에 저장한다.
>> : 명령어의 출력을 파일에 추가한다. 파일이 존재하지 않는 경우 새로 생성한다.
예: echo "새로운 내용" >> filelist.txt는 "새로운 내용"을 filelist.txt 파일의 끝에 추가한다.
< : 파일의 내용을 명령어의 입력으로 사용한다.
예: sort < unsorted.txt는 unsorted.txt 파일의 내용을 정렬하여 출력한다.
파이프(Pipe)는 한 명령어의 출력을 다른 명령어의 입력으로 직접 연결한다. 이를 통해 여러 명령어를 연결하여 복잡한 처리를 한 줄의 명령어로 수행할 수 있다.
네트워크를 통해 전송된 데이터를 파이프를 사용해 여러 단계의 처리 과정을 거친 후 최종적으로 원하는 결과를 얻을 수 있다. 예를 들어, 네트워크로부터 수신된 데이터를 파싱하고, 필터링하고, 변환하는 등의 작업을 파이프라인을 구성하여 처리할 수 있다.
| : 앞의 명령어 출력을 뒤의 명령어의 입력으로 전달한다.
예: ls | sort는 현재 디렉토리의 파일 목록을 정렬하여 출력한다.
+예: cat filelist.txt | grep "특정 문자열"은 filelist.txt 파일에서 "특정 문자열"을 포함하는 라인만을 검색하여 출력한다.
소켓(Socket)은 네트워크를 통한 데이터 송수신을 위한 인터페이스이다. 소켓을 사용하면, 프로그램은 네트워크 상의 다른 시스템과 데이터를 주고받을 수 있다. 리다이렉션과 파이프는 로컬 시스템 내에서 데이터의 흐름을 제어하는 데 사용되는 반면, 소켓은 네트워크를 통해 떨어진 위치에 있는 시스템 간의 데이터 흐름을 제어한다.
서버와 클라이언트 간의 소켓 통신은 네트워크 통신의 기본적인 모델 중 하나로, 데이터를 교환하기 위한 연결을 설정하고 유지하는 방식이다. 소켓은 네트워크 상에서 데이터를 송수신하기 위한 엔드포인트로, IP 주소와 포트 번호로 정의된다.
서버:
- 소켓 생성: 서버는 socket() 함수를 호출하여 소켓을 생성한다.
- 소켓 바인딩: 생성된 소켓에 IP 주소와 포트 번호를 할당하기 위해 bind() 함수를 사용한다. 이는 서버의 주소로 사용된다.
- 리스닝: listen() 함수를 호출하여 서버 소켓이 클라이언트의 연결 요청을 대기하도록 설정한다.
- 연결 수락: 클라이언트로부터의 연결 요청이 들어오면, accept() 함수를 호출하여 연결을 수락한다. 이 함수는 새로운 소켓을 반환하며, 이 소켓을 통해 클라이언트와 통신한다.
클라이언트:
- 소켓 생성: 클라이언트도 socket() 함수를 호출하여 소켓을 생성한다.
- 서버에 연결: connect() 함수를 사용하여 서버의 IP 주소와 포트 번호로 설정된 서버 소켓에 연결을 시도한다.
데이터 송수신:
- 데이터 전송: 연결이 설정되면, 서버와 클라이언트는 send() 또는 recv() 함수(또는 write(), read() 함수)를 사용하여 데이터를 송수신한다.
- 통신 종료: 데이터 송수신이 완료되면, close() 함수를 호출하여 소켓 연결을 종료한다.
'서버' 카테고리의 다른 글
Express.js Clean Architecture 구성하기 (0) | 2024.04.12 |
---|---|
Proxy 서버 구현 (1) | 2024.03.24 |
echo server, tiny server 구현 (2) | 2024.03.24 |
Parsing, Caching, Filtering, Load Balancing, MTU, NAT (1) | 2024.03.23 |