프로그램에서 네트워크를 통해 데이터를 송수신 할 때 쓰이는 개념, 장치 중에 하나로 '소켓' 이라는 것이 있다. 소켓의 원래 뜻은 "구멍, 연결"과 같은 사전적인 의미를 갖는다. 물론 컴퓨터에서의 소켓은 실질적인 물체는 아니고 일종의 인터페이스 역할을 해주는 것인데 사람 입장에서 이해하기 쉽게 추상적인 것을 소켓 이라는 이름으로 정의 내렸다.
TCP/IP 라는 규약을 가지고 네트워크 상에서 콘센트 역할을 하며 데이터를 주고 받기 때문에 우리는 이것을 '소켓 프로그래밍' 이라고 부른다. 아무것도 모르는 입장에서 이렇게만 들으면 도대체 소켓이 뭔지 알길이 없지만 사실 쓰임은 간단하다. 프로그램에서 네트워크를 통해 다른 프로그램, 기기, 컨트롤러 등과 데이터를 주고 받고 싶다면 소켓을 생성해서 사용하면 된다. 정말 이해하기 쉽게 쓰자면 언어마다 상이하겠지만 예를 들어 new Socket() 과 같이 쓰면 되는 것이다. 그래도 개념을 정확히 알아야 쓸 수 있으니 다음 그림을 보자.
소켓은 클라이언트 소켓과 서버 소켓이 있지만 한번 연결되면 양방향으로 데이터를 송신하고 수신할 수 있다. 소켓 통신의 단계는 이러하다.
1. (Socket) 우선 클라이언트와 서버 모두 소켓을 생성한다.
2. (Bind) 소켓은 네트워크 환경에서 데이터를 주고 받기 때문에 ip 와 포트 등의 설정이 필요하다. 서버에서 하는 Bind 와 같은 작업이 그런 작업들이다.
3. (Listen) 서버는 대기 상태로 들어가 클라이언트의 연결 요청을 기다린다.
4. (Connect) 클라이언트에서 연결 요청을 보낸다.
5. (Accept) 서버는 클라이언트로부터 온 Connect 요청을 수락한다.
6. (Send / Receive) 5번의 Accept 순간 소켓은 서로 연결 된 것이다. 이제 양쪽 어디서든 데이터를 Send 하거나 Receive 하면 된다.
7. (Close) 그림에는 없지만 통신이 끝났다면 Close 를 통해 소켓을 닫아준다.
이런 방식으로 통신을 하면 데이터 자체를 주고 받는 것에 대한 어려움은 없다.
그렇지만 통신이라는 것이 프로그램 내부에서 동작하는 것이 아니라 다른 장치 등과 연결되어 동작하기 때문에 외부적인 어려움은 정말 많다. 연결이 약하거나 갑자기 끊겼을때, 요청을 보냈는데 응답이 원하는 시점에 오지 않을 때 등 현실적인 변수는 무수히 많으니 통신 프로그램을 짜는 것은 완벽히 숙지 해놔야 부가적인 오류들을 잡는 것에 집중할 수 있을 것이다.
'.NET' 카테고리의 다른 글
[C#] DataGridView 로딩 시 셀 선택 막기 (0) | 2020.01.28 |
---|---|
[C#] 동기 소켓 프로그래밍 예제 (0) | 2020.01.21 |
[C#] 문자열 자르기 - Substring, Split, IndexOf 의 사용 (0) | 2020.01.21 |
[C#] 파일 이동 및 복사, 삭제 (0) | 2020.01.21 |
[C#] 기본적인 파일 쓰기 및 읽기 (0) | 2020.01.20 |