728x90
네트워크 프로그래밍과 소켓의 이해
01-1 네트워크 프로그래밍과 소켓의 이해
- 네트워크 프로그래밍 : 서로 다른 두 컴퓨터가 데이터를 주고 받을 수 있도록 하는 것.
- 소켓(Socket) : 물리적으로 연결된 네트워크 상에서 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치. 프로그래밍에서의 ‘소켓’은 네트웨크 망의 연결에 사용되는 도구다. 연결이라는 의미가 담겨있어서 ‘소켓’이라는 표현을 사용한다. 그리고 그 의미를 조금 더 확장해서 소켓은 네트워크를 통한 두 컴퓨터에 연결을 의미하기도 한다.
socket 함수를 통해 소켓생성
- 소켓생성 - socket 함수 호출
- IP주소와 PORT번호 할당 - bind 함수호출
- 연결요청 가능상태로 변경 - listen 함수호출
- 연결요청 대한 수락 - 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