2016년 10월 10일 월요일

[C#교육,닷넷교육,실무중심교육★탑크리에듀][강좌#2]C#으로 소켓(Socket) 다루기(1)

Socket Programming 

------- 
소켓 
------- 
소켓 이란? 두 프로그램이 네트워크를 통해 서로 통신을 수행 할 수 있도록 양쪽에 생성 되는 링크의 단자이다. 두 소켓이 연결되면 서로 다른 프로세스끼리(프로세스가 원격에 있든지 로컬에 있든지 상관 없다.) 데이터를 전달 할 수 있다. 결국 소켓이 구현됨으로써 네트워크 및 전송 계층의 캡슐화가 가능해 졌다. 

소켓은 원래 캘리포니아 버클리 대학 분교에서 UNIX 용으로 개발 되었으며 유닉스에서의 입출력 메소드의 표준인 개방/읽기/쓰기/닫기 메커니즘을 따른다. 

------- 
소켓 형식 
------- 
1.        스트림 소켓 
스트림소켓은 양방향으로 바이트 스트림을 전송 할 수 있는 연결 지향형 소켓으로 양쪽 어플리케이션이 모두 데이터를 주고 받을 수 있다는 것을 의미 한다. 스트림소켓은 오류수정, 전송처리, 흐름제어 등을 보장 해 주며 송신된 순서에 따른 중복되지 않은 데이터를 수신 하게 된다. 이 소켓은 각 메시지를 보내기 위해 별도의 연결을 맺는 행위를 하므로 약간의 오버헤드가 존재 한다. 그러므로 소량의 데이터 보다는 대량의 데이터를 보내는 경우에 적당 하다. 스트림소켓은 이러한 품질의 통신을 수행 하기 위하여 TCP 프로토콜을 사용 한다. 

2.        데이터그램 소켓 
명시적으로 연결을 맺지 않으므로 비 연결형 소켓이라고 한다. 메시지는 대상 소켓으로 전송되며 대상 소켓은 메시지를 적절히 수신 한다. 스트림 소켓을 사용하는 것이 데이터그램 소켓을 사용 하는 것 보다 더 신뢰성이 높은 방법이지만 연결을 수립하는데 드는 오버헤드는 무시 할 수 없다. 데이터그램 소켓을 사용하려면 클라이언트에서 서버로 데이터를 전송 할 때 UDP를 사용 한다. 이 프로토콜에서는 메시지의 크기에 약간의 제한이 있으며 메시지의 확실 한 전달 역시 보장 하지 않으며 통신 중 데이터를 잃어 버리더라도 오류를 되돌리지 않는다. 
3.        Raw 소켓 
Raw 소켓은 패킷을 가져오면 TCP/IP 스택상의 TCP, UDP 계층을 우회하여 바로 애플리케이션으로 송신하는 소켓이다. 이런 소켓에서 패킷은 TCP/IP 필터를 통해 전달 되지 않으므로 원형 그대로의 패킷을 볼 수 있다. 이는 모든 데이터를 적절히 처리하거나 헤더를 제거하고 이를 파싱 하는 과정은 모두 수신 애플리케이션에서 담당해야 하는 것이다. 실제 Raw 소켓을 이용하여 프로그래밍을 하는 일은 거의 드물며 만약 시스템 소프트웨어나 패킷을 분석하는 프로그램을 개발 시에는 필요 할 수도 있다. 즉 Raw Socket은 저수준 프로토콜 애플리케이션을 작성 할 때 주로 사용 된다고 보면 된다. 


--------- 
포트 
--------- 
여러 개의 애플리케이션들이 동시에 통신을 수행하기 위하여 포트가 정의 되는데 기본적으로 포트는 IP 주소 표기를 확장 하는 개념 이다. 네트워크에서 패킷을 수신하는 애플리케이션이 동시에 실행 되고 있는 컴퓨터로 연결을 맺을 때 송신자가 알고 있는 수신 애플리케이션의 고유 포트 번호를 이용하여 대상 프로세스를 식별 하는 것이다. 

소켓 번호는 컴퓨터의 IP 주소와 TCP 애플리케이션에서 사용하는 포트 번호로 이루어져 있다. IP주소는 인터넷 상에서 유일 하고 포트 번호는 개별 컴퓨터에서 유일하기 때문에 전체 인터넷에서 소켓 번호 또한 유일 한 것이다. 

----------------------- 
.NET 에서 소켓 다루기 
----------------------- 
System.Net.Sockets 네임스페이스의 클래스들은 .NET에서 지원하는 소켓들을 제공 한다. 

System.Net.Sockets.MulticastOption : IP 멀티캐스트 그룹에 참여 하거나 탈퇴하기 위한 IP 주소 값을 설정 한다. 

System.Net.Sockets.NetworkStream : 데이터를 주고 받는 하위 스트림을 구현 한다. 이는 TCP/IP 통신 채널에 대한 연결을 나타내는 고수준 추상형이다. 이 클래스를 이용하여 네크워크 소켓을 통해 데이터를 주고 받을 수 있다. NetworkStream은 버퍼 기능이 지원되지 않으므로 BufferedStream을 중간 저장 매체로 함께 사용 하기도 한다. 
System.Net.Sockets.TcpClient : Socket 클래스를 기반으로 하여 작성 되었으며 고수준 TCP 서비스를 제공하여 준다. 

System.Net.Sockets.TcpListener : Socket 클래스를 기반으로 작성 되었으며 서버 애플리케이션에서 사용 한다.이 클래스는 들어오는 클라이언트의 연결을 리스닝 하며 애플리케이션에게 연결된 요청을 알려 준다. 

System.Net.Sockets.UdpClient : UDP 서비스를 구현하기 위한 클래스 

System.Net.Sockets.SocketException : 소켓에서 오류가 존재할 때 발생하는 예외 

System.Net.Sockets.Socket : 소켓 애플리케이션의 기본 기능을 제공 한다. 


------------------------ 
System.Net.Sockets.Socket 
------------------------ 
Socket 클래스는 네트워크 프로그래밍에서 중요한 역할을 담당 하는데 클라이언트와 서버 사이의 모든 동작을 수행 한다.윈도우 소켓 API의 해당 하는 메소드로 매핑 된다. 

아래는 몇 가지 속성 이다. 

AddressFamily : 소켓의 주소 계열을 획득, Socket.AddressFamily 열거형의 값 이다. 
Available : 읽을 수 있는 데이터 량을 Return 
Blocking : 소켓이 블로킹 모드 인지 확인 
Connected : 소켓이 원격 호스트에 연결 되어 있는 지 
LocalEndPoint : 로컬 종점을 돌려 줌 
ProtocolType : 소켓의 프로토콜 형식을 돌려 준다. 
SocketType : 소켓의 타입을 돌려 준다. 

아래는 몇 가지 메소드 이다. 
Accept() : 들어오는 연결을 다루기 위한 새로운 소켓을 생성 
Bind() : 들어오는 연결을 리스닝 하기 위하여 소켓을 로컬종점으로 연결 
Close() : 소켓을 종료 
Connect() : 원격 호스트에 연결을 맺는다. 
Listen() : 리스닝 상탸로 만든다, 이것은 서버 소켓에서만 사용 된다. 
Receive() : 연결된 소켓으로부터 데이터를 수신 한다. 
Send() : 연결된 소켓으로 데이터를 송신 한다. 
Shutdown() : 소켓에 대한 연결을 비 활성화 한다. 

다음 시간에는 실제 예제를 작성하며 이해해 보도록 하죠... 

댓글 없음:

댓글 쓰기