본문 바로가기
제조실행시스템(MES)

3.1 인터페이스(소켓 API/ BSD 유닉스 rsh, rcp)

by 네이든 루니 2023. 4. 6.
반응형

디바이스 드라이버 계층 프로그래밍은 OSI의 계층 2 이하의 인터페이스(링크 계층과 하드웨어 디바이스)를 통해 프레임 단위의 데이터 송수신을 직접 다룹니다. LAN에서 MAC 프레임 단위의 송수신을 다루는 API로서 FTP사의 패킷 드라이버나 MS사의 NDIS, Novell사의 ODI 등이 있습니다.

manufacturing-execution-system
제조실행시스템

3.1.3 네트워크 프로그래밍(소켓)

MAC 프로토콜의 종류와 LAN 카드 제조사에 무관하게 드라이버 계층의 네트워크 프로그램을 작성할 수 있습니다. 구체적으로 송수신을 제어하거나 네트워크 상태 모니터링에 사용되며 흐름 제어, 오류 제어, 인터넷 주소 관리 같은 기능은 사용자가 별도로 구현해야 합니다.


트랜스포트 계층 프로그래밍은 TCP나 UDP와 같은 트랜스포트 계층의 기능을 직접 이용하며 호스트 사이의 연결 관리와 패킷 단위의 데이터 송수신을 직접 제어합니다. UNIX의 BSD 소켓이나 윈도우 소켓 등 소켓(socket) API가 대표적이며, 소켓 인터페이스는 BSD 유닉스에서 처음 보급되었으나 현재는 컴퓨터 기종이나 OS에 무관하게 지원하고 있습니다.

 

TCP/IP를 제공하는 컴퓨터에서 기본적으로 모두 지원하고 있습니다. 응용 계층 프로그래밍은 네트워크 유틸리티나 미리 만들어진 응용 계층 서비스 프로그램을 활용하는 방식으로 OSI 5-7 계층을 이용하는 프로그래밍입니다. 패킷의  송수신을 구체적으로 제어하는 방식이 아니고 응용 작업 단위의 동작을 네트워크를 통해 실행합니다.

 

유닉스의 rsh(remote shell)이나 rcp(remote copy)를 이용하는 프로그래밍입니다. 또한 원격 컴퓨터에서 어떤 프로세스를 실행시키는 RPC(Remote Procedure Call) 프로그래밍이나 HTTP를 이용하는 HTML 프로그래밍, 웹 프로그래밍, 미들웨어를 이용하는 분산 객체 프로그래밍 등이 사용 예입니다.

 

하위 계층의 동작(종점 호스트 간의 연결 설정, 패킷 송수신, 흐름제어 등)을 구체적으로 제어하지는 못하지만 복잡한 기능의 네트워크 서비스 프로그램을 짧은 시간 내에 작성할 수 있습니다.
 
소켓은 TCP나 UDP 같은 트랜스포트 계층 네트워크 프로그래밍에서 가장 널리 사용되는 API입니다. 1982년 BSD 유닉스 4.1에서 소개되었으며 모든 유닉스 운영체제에서 제공됩니다. 윈도우는 윈속(Winsock)이라는 이름으로 소켓 API를 제공하며 자바 플랫폼에서도 소켓을 이용하기 위한 클래스를 제공합니다.
 
소켓 인터페이스는 응용 프로그램과 소켓 사이의 인터페이스를 담당하며 응용 프로그램에서 TCP/IP를 이용하는 창구 역할을 합니다. 소켓을 사용하기 위한 전제 조건은 클라이언트-서버 통신 모델에서는 항상 서버 프로그램이 먼저 수행되어야 합니다.

서버는 socket( )을 호출하여 통신에 사용할 소켓을 개설합니다. 리턴된 소켓 번호와 자신의 소켓 주소를 bind( )로 서로 연결합니다. 소켓 번호는 응용 프로그램 내에서만 알고 있는 통신 창구 번호이고, 소켓 주소는 네트워크 시스템만 아는 주소이므로 이들을 bind( )를 통하여 묶어야 응용 프로세스와 네트워크 시스템 간의 데이터 전달이 가능합니다.
 

서버는 listen( )을 호출하여 수동 대기모드로 들어갑니다. 클라이언트로부터 오는 연결 요청이 처리 가능해지는데 서버는 accept( ) 함수를 호출하여 클라이언트와 연결 설정을 합니다. 클라이언트와 연결이 성공하면 accept( )가 새로운 소켓을 하나 리턴하게 되는데 이 소켓을 통해 데이터를 송수신하게 됩니다.
 
클라이언트는 socket( )을 호출하여 소켓을 만든 후 서버와 연결 설정을 위해 connect( )를 호출하게 됩니다. 접속할 상대방 서버의 소켓 주소 구조체를 만들어 connect( ) 함수의 인자로 주게 되는데 클라이언트는 서버와 달리 bind( )를 호출하지는 않습니다. 자신의 IP 주소나 포트 번호를 특정한 값으로 지정해 둘 필요가 없으며 특정 포트 번호를 사용할 땐 bind( )를 호출합니다. 그러나 bind( )를 사용하면 클라이언트 프로그램의 안정성이 떨어진다는 단점이 있습니다.
 
멀리 떨어져 있는 두 사람이 전화를 하기 위해서는 전화기를 구입하고 전화번호를 할당하고 케이블을 연결하고 전화가 오길 기다렸다가 전화가 오면 승낙해서 대화를 하는 것인데, 이를 소켓 프로그래밍(네트워크 프로그래밍)과 비교해 볼 수 있습니다. 우선 소켓을 만들고 IP 주소를 할당하고 네트워크에 소켓을 연결하고 요청이 오길 기다렸다가 요청이 오면 데이터를 주고받는 것입니다.

반응형

댓글