네트워크 프로그래밍과 소켓

sz L·2023년 6월 19일
0

통신

목록 보기
4/11
post-thumbnail


콘솔(console)은 본래 대형 컴퓨터 시스템과 연결되어 데이터를 입력하는 장치 또는 입력된 데이터를 처리하여 결과를 출력하는 장치를 의미합니다. 여기서의 콘솔은 키보드나 모니터와 같은 표준 입출력 장치를 의미하며, 콘솔 입출력은 키보드에서 데이터를 입력받고 모니터에 데이터를 출력하는것을 말합니다.

그렇다면 파일 입출력의 의미는 무엇일까요? 파일 입출력은 파일에서 데이터를 입력받고 파일에 데이터를 출력하는것을 의미합니다.


소켓

  • 프로그래밍에서의 소켓은 네트워크 망의 연결에 사용되는 도구
  • 네트워크를 통한 두 컴퓨터의 연결을 의미함
  • 응용 프로그램은 소켓을 통하여 통신망으로 데이터를 송수신한다
  • 응용 프로그램에서 TCP/IP를 이용하는 창구 역할을 하며 응용 프로그램과 소켓 사이의 인터페이스 역할을 하고 있음
  • 두 소켓이 연결되면 서로 다른 프로세스끼리 데이터 전달 가능

기본적으로 소켓은 통신을 위한 일종의 통로라고 생각할 수 있음. 소켓은 상대방에게 데이터를 보내거나 받는 역할을 하며, 연결을 수동적으로 기다리느냐, 능동적으로 연결을 하느냐로 서버클라이언트냐 구분할 수 있다

- 클라이언트 소켓(Client Socket)

클라이언트 소켓은 기다릴 필요가 없기 때문에 바로 클라이언트 소켓을 생성한다. 클라이언트 프로그램에서 클라이언트 소켓은 서버프로그램으로 연결요청을 하는것과 데이터 전송을 하는 일을 한다.

- 서버 소켓(Server Socket)

서버 소켓은 말 그대로 서버 프로그램에서만 사용하는 소켓이다. 서버소켓은 클라이언트로부터 연결 요청이 오기를 기다렸다가 연결 요청이 들어오면 클라이언트와 연결을 맺고 다른 소켓을 만드는 일을 한다.

소켓의 생성과정

  1. 소켓 생성
    • socket 함수호출 → socket 생성
    #include <sys/socket.h>
    int socket(int domain, int type, int protocol);
    // 성공 시 파일 디스크럽터, 실패 시 -1 반환
  2. IP주소와 PORT번호 할당
    • bind 함수호출 → IP 주소와 PORT번호를 할당
    #include <sys/socket.h>
    int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
    // 성공 시 0, 실패 시 -1 반환
  3. 연결요청 가능상태로 변경
    • listen 함수호출 → 연결요청을 받아들일 수 있는 상태가 됨
    #include <sys/socket.h>
    int listen(int sockfd, int backlog);
    // 성공 시 0, 실패 시 -1 반환
  4. 연결요청에 대한 수락
    • accept 함수호출 → 연결요청을 수락함, 연결요청이 없는 상태에서 이 함수가 호출되면 연결요청이 있을 때까지 함수는 반환되지 않음
    #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을 적어주면 된다.

리눅스 기반 파일 조작하기

리눅스에서 소켓조작은 파일조작과 동일하게 간주됨

저수준

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글