본문 바로가기
Delphi Tip/통신

소켓 프로그래밍 기법의 활용 2편

by MonoSoft 2021. 12. 20.
728x90
반응형

소켓 프로그래밍 기법의 활용 2편

 

연결의 종류

 

소켓 연결에는 연결의 초기화와 어떤 로컬 소켓이 연결되는지에 

따라 기본적으로 다음과 같은 세가지로 나누어 볼 수 있다.

 

1. 클라이언트 연결 (Client connections)

클라이언트 연결은 로컬 시스템의 클라이언트 소켓을 

리모트 시스템의 서버 소켓에 연결하는 것을 말한다. 

클라이언트 연결은 클라이언트 소켓에 의해 개시되고 초기화된다. 

먼저 클라이언트 소켓이 연결하고자 하는 서버 소켓에 대한 정보를 제공하면, 

클라이언트 소켓이 서버 소켓을 찾게 되고, 

서버의 위치를 파악하게 되면 연결을 요구한다. 

 

서버 소켓은 클라이언트 요구에 대한 큐(queue)를 가지고 있어서 

시간이 될 때마다 연결을 시도한다. 

일단 서버 소켓이 클라이언트 연결을 받아들이면 

클라이언트 소켓에 연결된 서버 소켓에 대한 모든 정보를 전송하게 되며, 

클라이언트에 의해 연결이 완료된다

 

2. 리스닝 연결 (Listening connections)

서버 소켓이 활동적으로 클라이언트를 찾아서 연결을 시도하지 않고, 

수동적으로 클라이언트의 요구를 기다리는 

하프 연결 (half connection) 상태를 유지하는 형태의 연결이다. 

서버 소켓은 큐를 리스닝 연결과 연관지어서 관리하며, 

큐에는 클라이언트의 연결 요구가 계속 기록된다. 

일단 서버 소켓이 클라이언트의 연결 요구를 받아들이면 

클라이언트와 연결하기 위한 새로운 소켓을 생성하게 된다.

 

이렇게 하면 리스닝 연결 자체는 다른 클라이언트 요구를 받아들일 수 있도록 

계속 열려있게 할 수 있다.

 

3. 서버 연결 (Server connections)

서버 연결은 서버 소켓에 의해서 이루어지는 것으로, 

리스닝 소켓이 클라이언트 요구를 받아들이면 생성된다. 

일단 서버가 연결을 받아들이면 서버 소켓의 정보가 

클라이언트에게 전송되어 클라이언트 소켓이

이 정보를 받으면 연결이 완료되는 형태이다.

일단 연결이 되면 서버 연결과 클라이언트

연결은 차이가 없는 연결 방식이다. 

기본적으로 클라이언트 연결과 서버 연결은 

두개의 종료점(endpoint)를 가지며 같은 능력과 같은

종류의 이벤트를 사용한다. 

그에 비해 리스닝 연결은 단지 하나의 종료점 만을 가지고 있는

본질적으로 다른 연결방식이다.

 

서비스 프로토콜

네트워크 서버와 클라이언트를 개발하기에 앞서, 

먼저 어플리케이션이 제공하거나 사용하게 될 
서비스에 대한 이해가 반드시 선행되어야 한다. 

많은 서비스 들은 네트워크 어플리케이션이 반드시 지원해야 하는 

표준 프로토콜을 가지고 있다. 

만약 HTTP, FTP 등의 표준 서비스를 지원하는 

네트워크 어플리케이션을 제작한다면, 

다른 시스템과 통신하게 되는 프로토콜에 대한 이해가 필요하다.

 

만약 다른 시스템과 통신하는데 있어서 

새로운 형태의 서비스를 제공한다면, 제일 먼저

서비스를 사용하게 될 서버와 클라이언트 사이의 

통신 프로토콜을 디자인해야 한다. 

 

이때에는 어떤 메시지가 전달될 것이며, 

이런 메시지 들이 어떻게 조화를 이루어야 하며, 

정보의 암호화는 어떤 형식으로 할 것인지 등을 결정해야 한다.

 

가끔 네트워크 서버와 클라이언트 어플리케이션에서 네트워킹 소프트웨어와 

서비스를 사용하는 어플리케이션 사이에 레이어(layer)를 제공하는 경우가 있다. 

예를 들어, HTTP 서버는 인터넷과 웹서버 어플리케이션 사이에 위치하여 

컨텐트를 제공하고, HTTP 리퀘스트 메시지에 반응하게 된다.

 

소켓은 네트워크 서버와 클라이언트 어플리케이션, 

네트워킹 소프트웨어 사이에 인터페이스를 제공한다. 

이때 ISAPI 등의 흔히 사용되는 표준 서버에 대한

API를 복사해서 사용할 수도 있고, 

자신만의 API를 디자인해서 사용할 수도 있다.

 

서비스와 포트

대부분의 서비스는 특정 포트 번호와 연관되어 있다. 

이럴 때에는 포트 번호를 서비스에 대한

번호 코드(numeric code)로 생각할 수 있다. 

만약 표준 서비스를 구현한다면 

델파이의 윈도우 소켓 객체의 메소드를 이용하면 

그 서비스에 대한 포트 번호를 알아낼 수 있다. 

 

그에 비해 새로운 서비스를 제공하는 경우라면 

윈도우 95나 NT의 Services 파일에 포트 번호를 연관시켜 지정할 수 있다.

 

소켓 연결과 데이터 송수신

다른 시스템과 소켓 연결을 하는 이유는 

연결을 통해서 정보를 송수신할 수 있기 때문이다. 

이때 어떤 정보를 주고 받을 지와 언제 어떤 방식을

사용할 지 등은 소켓 연결에 

사용된 서비스에 좌우된다.

 

이렇게 데이터를 읽고 쓰는 데에는 두가지 방식이 있다. 

소켓에 데이터를 읽고 쓸 때 비동기적인 방식을 사용해서 

네트워크 어플리케이션에서 다른 코드의 실행을 방해하지 않는 것을 

논-블로킹 연결(Non-Blocking connections)이라고 하며, 

데이터를 읽고 쓰는 작업을 쓰레드를 이용하여 

독립적으로 실행하는 형태의 연결을 블로킹 연결(Blocking connections)이라고 한다.

 

3편 계속......

728x90
반응형

댓글