■ 소켓

 

기계장치를 다룰 때는 모두 OS를 통하게 된다. OS는 기계장치를 직접적으로 제어할 수 있는 소프트웨어라고 볼 수 있다.

고급언어 → 사람이 알아보기 쉬운 언어, 메모리에 올라가 있는 데이터를 다루는 일 밖에 할 수 있는 일이 없다.

데이터 올리기, 내리기, 가공하는 것만 고급언어로 가능하다.

프로그래밍 언어에서는 실제로 메모리밖에 다룰 수 있는게 없다.

 

cpu안에 짜 놓은 프로그램을 instruction set(=명령어 세트, core)라고 한다.

이 명령어들이 하는 일 역시, 메모리와의 작업만 가능 하다. 메모리에 데어터를 넣고 빼는 일 같은 것.

메모리에 저장되어 있는 함수를 빼내와서 core에서 돌린다.

하지만 이때는 함수라고 표현하지 않는다.

c언어와 같은 고급언어로 작성된 것이 컴파일되어 메모리로 올라가면 이미 함수가 아니며,

그것을 cpu의 명령어들이 가지고 와서 돌린다. 이것이 스레드이다.

cpu에서 처리한 결과를 다시 메모리에 올리고, 랭귀지(c언어, c#, java등)가 다시 가져가게 되는 것이다.

이런 과정을 거쳐 통신을 하게 되는 것이다.

 

고급언어(C, C#, JAVA...) ↔ 메모리 ↔ CPU

 

콘솔프로그램-키보드에서 올라오는 데이터를 버퍼라는 메모리공간을 사용하여 데이터 이용가능함(버터에 데이터를 넣었다 꺼냄)

파일-fopen함수 이용시 FILE구조체를 메모리에 올려놓은 후 포인터로 가리켜 사용

직렬통신-DCB

비트맵-RGB칼라 구조체에 저장했다 메모리에 올려서 사용

→ 함수의 이름만 다를 뿐 모두 메모리 공간을 이용해야만 데이터를 사용할 수 있다.

 

꼭 실제 데이터가 메모리에 올라가야 하는것은 아니지만 모두 메모리 공간을 거쳐야 이용가능하다.

(데이터가 너무 클 경우 포인터 등을 이용할 수 있다.)

메모리에 올라가 있는 데이터가 바로 소켓!

 

소켓을 다룬다는것은 실데이터(전송하거나 전송받는)와 실데이터와 함께 전송되어지는 메타데이터를 다룬다는 것이다.

이때 함수는 내가 만들거나 OS에서 제공한 것을 사용 가능하다. 하지만 실제로 직접 함수를 만든다는 것은 힘들다.

내가 함수를 만든다는것은 TCP/IP 프로토콜을 만든다는 것과 같다.

TCP/IP 프로토콜은 드라이버를 만들어줘야 하고 그것을 위해서는 C언어로만은 안되기 때문에,

OS가 만들어놓은 함수와 초기화 해 놓은 소켓구조체(구조체라고 하기엔 너무 크기 때문에 실제 구조체라고도 잘 안함)를 우리는 사용한다.

그래서 TCP/IP 구조체 프로그래밍이라고 하지 않고 '소켓'이라고 한다.

 

CSocket과 CAsyncSocket의 차이는  가지고 있는 메타정보가 다르다는 것이다.

실 데이터는 차이가 없고 어떤 식으로 통신을 하겠느냐는 것. 각각 동기식, 비동기식 소켓.

 



소켓(Socket)-TCP/IP 프로토콜(운영체제에 설치되어 있는 소프트웨어)과

현재 내가 만들고 있는 프로그램(예를 들면 메신저와 같은)을 중간에서 연결해주는 구조체와 함수의 집합

 

CSocket - 구조체, 함수...

CAsyncSocket - 구조체, 함수...

 

CAsyncSocket - Object클래스로부터 직접 상속 받은 최상위 클래스 중 하나이다.

CSocket - CAsyncSocket을 상속받아서 만든 클래스이다.

 

전자는 소켓 프로그래밍에 필요한 내용을 제공하는 기본클래스(Base Class)로서, 비동기식으로 동작하며,

후자는 전자를 상속받아 좀 더 많은 기능을 편리하게 제공한다.

 

동기식, 비동기식 동작의 차이

(동기식 입/출력, 동기화 프로그래밍과는 다른 얘기. 네트웍에서 동기식/비동기식으로 동작 한다는 것.)

동기식이란, 하나의 작업이 끝나기 전까지는 다른 작업을 할 수 없는 동작방식.

CSocket(동기식 동작방식)은 10MB의 파일을 전송하기 위해서 상당한 시간이 소요되는데도 불구하고,

응용프로그램은 전송행위가 끝날때까지 아무것도 하지 못한 채 기다려야 한다는 의미이다.

 

비동기식은 동기식의 역으로 생각하면 된다. 즉, 현재 전송중인 파일이 있음에도 또다른 파일을 전송하는 등의 작업이 가능하다.

 

TCP/IP 프로토콜  ↔ CSocket ↔ P/G

 

실제 TCP/IP 프로그래밍을 할때는 통신관련 WinAPI에 수많은 함수들이 존재하므로 WinAPI를 프로그램에서 다이렉트로 불러서 이용한다.

CSocket에서 제공하는 함수는 종류가 얼마안되므로 실제 업무에서 MFC 클래스 중 CSocket은 사용빈도가 낮다.

→ TCP/IP 프로그래밍 할 때 WinAPI를 사용.

Posted by 마마필로 :