책/TCP\IP 소켓 프로그래밍

Chapter 01. 네트워크 프로그래밍과 소켓의 이해

에린_1 2024. 2. 21. 23:51
728x90

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

01-1 네트워크 프로그래밍과 소켓의 이해

  • 네트워크 프로그래밍 : 서로 다른 두 컴퓨터가 데이터를 주고 받을 수 있도록 하는 것.
  • 소켓(Socket) : 물리적으로 연결된 네트워크 상에서 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치. 프로그래밍에서의 ‘소켓’은 네트웨크 망의 연결에 사용되는 도구다. 연결이라는 의미가 담겨있어서 ‘소켓’이라는 표현을 사용한다. 그리고 그 의미를 조금 더 확장해서 소켓은 네트워크를 통한 두 컴퓨터에 연결을 의미하기도 한다.

socket 함수를 통해 소켓생성

  1. 소켓생성 - socket 함수 호출
  2. IP주소와 PORT번호 할당 - bind 함수호출
  3. 연결요청 가능상태로 변경 - listen 함수호출
  4. 연결요청 대한 수락 - accept 함수호출
  • 클라이언트 프로그램에서는 socket 함수 호출을 통한 소켓의 생성과 connect 함수 호출을 통한 서버로의 연결요청 과정만이 존재한다.

01-2 리눅스 기반 파일 조작하기

  • 리눅스에서의 소켓 조작은 파일 조작과 동일하게 간주된다.
  • 리눅스는 소켓을 파일의 일종으로 구분한다. 따라서 파일 입출력 함수를 소켓 입출력에, 네트워크상에서의 데이터 송수신에 사용할 수 있다.
    • 윈도우는 리눅스와 달리 파일과 소켓을 구분하고 있다.

저 수준 파일 입출력(Low-level File Access)과 파일 디스크립터(File Descriptor)

  • 파일 디스크립터란 시스템으로부터 할당받은 파일 또는 소켓에 부여된 정수를 의미한다.
  • 표준 입출력 및 표준 에러에도 리눅스에서는 파일 디스크립터를 할당하고 있다.
  • 일반적으로 파일과 소켓은 생성의 과정을 거쳐야 다일 디스크립터가 할당된다.
  • 파일 또는 소켓을 생성할 때마다, 운영체제는 해당 파일 또는 소켓에 부여된 숫자 하나를 건네준다.

파일열기

  • open(path, flag)
    • path : 대상이 되는 파일의 이름 및 경로 정보
    • flag : 파일의 오픈 모드 정보(파일의 특성 정보)
    • 데이터를 읽거나 쓰기 위해서 파일을 열 때 사용하는 함수

파일닫기

  • close(fd)
    • fd(디스크립터) : 닫고자 하는 파일
    • 파일은 사용 후 반드시 닫아줘야 한다. 파일을 닫을 때 사용하는 함수 파일 뿐만 아니라 소켓을 닫을 때도 사용한다.

파일에 데이터 쓰기

  • write(fd, buf, nbytes)
    • fd : 데이터 전송 대상을 나타내는 파일 디스크립터
    • buf : 전송할 데이터가 저장된 버퍼의 주소 값
    • nbytes : 전송할 데이터의 바이트 수 전달.
    • 프로그래머에 의해 정의되는 자료형 이름과의 구분을 위해서, 시스템(운영체제)에서 정의하는 자료형의 이름에는 _t가 붙어있다.

파일에 저장된 데이터 읽기

  • read(fd, buf, nbytes)
    • fd : 데이터 수신 대상을 나타내는 파일 디스크립터
    • buf : 수신한 데이터를 저장할 버퍼의 주소 값
    • nbytes : 수신할 최대 바이트 수
    • 데이터를 입력(수신)하는 기능의 함수다.

01-3 윈도우 기반으로 구현하기

  • 윈속(winsock)의 초기화
  • 윈속 프로그래밍을 할 때에는 반드시 WSAstartup 함수를 호출해서, 프로그램에서 요구하는 윈도우 소켓의 버전을 알리고, 해당 버전을 지원하는 라이브러리의 초기화 작업을 진행해야한다.
  • WSAstartup(WORD wversionRequested, LPWSADATA lpWSAData)
    • WORD wversionRequested : 프로그래머가 사용할 윈속의 버전 정보
    • LPWSADATA lpWSAData : WSADATA라는 구조체 변수의 주소 값
  • 윈도우 소켓에는 몇몇 버전이 존재한다. 따라서 사용할 소켓의 버전정보를 WORD 행으로 구성해서 전달한다.
728x90