콘솔(console)은 본래 대형 컴퓨터 시스템과 연결되어 데이터를 입력하는 장치 또는 입력된 데이터를 처리하여 결과를 출력하는 장치를 의미합니다. 여기서의 콘솔은 키보드나 모니터와 같은 표준 입출력 장치를 의미하며, 콘솔 입출력은 키보드에서 데이터를 입력받고 모니터에 데이터를 출력하는것을 말합니다.
그렇다면 파일 입출력의 의미는 무엇일까요? 파일 입출력은 파일에서 데이터를 입력받고 파일에 데이터를 출력하는것을 의미합니다.
기본적으로 소켓은 통신을 위한 일종의 통로라고 생각할 수 있음. 소켓은 상대방에게 데이터를 보내거나 받는 역할을 하며, 연결을 수동적으로 기다리느냐, 능동적으로 연결을 하느냐로 서버냐 클라이언트냐 구분할 수 있다
클라이언트 소켓은 기다릴 필요가 없기 때문에 바로 클라이언트 소켓을 생성한다. 클라이언트 프로그램에서 클라이언트 소켓은 서버프로그램으로 연결요청을 하는것과 데이터 전송을 하는 일을 한다.
서버 소켓은 말 그대로 서버 프로그램에서만 사용하는 소켓이다. 서버소켓은 클라이언트로부터 연결 요청이 오기를 기다렸다가 연결 요청이 들어오면 클라이언트와 연결을 맺고 다른 소켓을 만드는 일을 한다.
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
// 성공 시 파일 디스크럽터, 실패 시 -1 반환
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
// 성공 시 0, 실패 시 -1 반환
#include <sys/socket.h>
int listen(int sockfd, int backlog);
// 성공 시 0, 실패 시 -1 반환
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 성공 시 파일 디스크럽터, 실패 시 -1 반환
// 디스크럽터는 리눅스에서 프로세스가 파일을 다룰 때 사용하는 개념으로, 특정 파일에 접근할 때 사용하는 추상적인 값이다.
// hello_server.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> void error_handling(char *message); int main(int argc, char *agrv[]) { int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; socklen_t clnt_addr_size; char message[]="Hello World!"; if(argc!=2) { printf("Usage : %s <port>\n", argv[0]); ... }
- bind, listen 함수의 호출이 이어지면서 서버 소켓이 된다.
(connect로 이어지면 클라이언트 소켓)- write 함수는 데이터를 전송하는 기능의 함수
// hellp_client.c #include <stdio.h> ...
- socket 생성과 connect 함수호출을 통한 서버로의 연결요청 과정 존재
- 127.0.0.1은 자신의 PC IP주소를 의미한다. 따라서 서버 클라이언트가 모두 한 컴퓨터에서 실행된다면 127.0.0.1을 적어주면 된다.
리눅스에서 소켓조작은 파일조작과 동일하게 간주됨