C#/Network
5. 비동기 TCPListener 예제
5. 비동기 TCPListener 예제
2023.10.06동기화 코드의 문제점 데이터를 보내는 작업과 받는 작업이 블록되는 문제 상황을 강제로 발생시켜보자. 네트워크 프로그램은 많은 부분에서 비동기 코드가 필요하다. Read( ) 함수의 동작은 C언어의 Scanf( ) 동작과 유사하다. Read( ) 함수는 stream에 전달받은 데이터가 있다면, 데이터를 읽어들인다. 하지만 읽을 데이터가 없다면, 데이터가 들어올 때까지 대기하는데, 이때 실행 흐름은 블록된다. 만약 이 상태에서 데이터를 전송시키고 싶다면, Send( ) 가 실행 제어권을 가지지 못하기에 전송 작업 실행은 불가능하다. 위의 예제 프로젝트의 소스코드는, 이전 포스트와 동일하다. TCPServer, TCPClient_Protocol 을 실행시면, 한 번의 전송 이후 각자 Read( ) 에서 서로 ..
4. 프로토콜
4. 프로토콜
2023.10.06프로토콜 1 응용 프로그래밍에서 네트워크를 사용해 데이터를 송수신 할때 사용하는 규칙을 의미한다. 네트워크 응용 프로그래밍에서, 일반적으로 데이터를 보낼 때는 정확한 바이트 파악 할 수 있다. 하지만 데이터를 받을 때는 몇 바이트가 올지 알 수가 없다. 그리고 데이터가 분산되어 여러번 전달 될 수도 있다. 그렇기에 네트워크 응용 프로그래밍은 서버와 클라이언트 사이에 주고 받는 데이터의 크기 및 데이터 구조 등에 대해 프로토콜(규칙)을 개발자가 정해야 한다. 프로토콜(규칙)의 예시 헤더에 차후 보낼 바이트의 크기 전송한다. 전달하는 데이터 마지막에 특정한 End of Message 마크를 사용한다. 일정 시간 아무 데이타가 없으면 수신 종료한다. 연결 종료시점까지 데이터를 읽는 방법 만약 이러한 프로토콜이..
3. TCPClient, TCPListener 예제
3. TCPClient, TCPListener 예제
2023.10.06TCPClient & TCPListener 내부적으로 System.Net.Sockets.Socket 클래스를 사용한다. 하지만 Socket 으로 작업하는 것보다 훨씬 간결하다. 네트워크 데이터 송수신은 기본적으로 바이트 자료형을 사용한다. 따라서 문자열을 보낼 경우 먼저 바이트로 인코딩한 후, 일반 영문은 ASCII로 인코딩하고, 한글 등 비영문 문자열은 UTF8 인코딩을 사용한다. 실행 흐름 TCPListener Server의 Listen( ) 동작을 의미한다. using System.Net.Sockets; using System.Net; namespace TcpServerTest { class Program { static void Main(string[] args) { // [1] 서버의 Liste..
2. .Net Socket 예제
2. .Net Socket 예제
2023.10.06프로그래밍 기술을 바라보는 개발자의 관점 모든 프로그래밍 기술은, 현실의 문제를 컴퓨터를 사용해 해결하는 하나의 방법일 뿐이다. 모든 프로그래밍 기술은, 인간이 사용해왔고, 현실에 존해하는 방법과 동일하다. 대표적으로 데이터베이스와 네트워크가 현실의 도서관과 물류 운송과 개념이 같다. 네트워크 개념 네트워크 동작은 물류 시스템과 비슷하다. 운송하는 대상이 상품에서 데이터로 변경되었을 뿐이다. 물류 운송처럼 네트워크 통신은 어떤 기기의 저장장치에 있는 데이터를 다른 기기에 저장장치로 옮기는 것이다. 문제가 있다면, 물류 센터의 시스템이 복잡하듯, 네트워크 통신은 서버의 데이터를 관리하는 방법이 어렵다. 우체국 택배를 보내는 절차와 통신 절차를 비교해보자. 물류 통신 대상 물건 데이터 1 상품의 크기에 맞춰..
1. 소켓 네트워크
1. 소켓 네트워크
2023.10.06Socket Socket Socket은 단말(eg. 전화기)을 논리적으로 추상화한 형태로, 일반적인 프로그램의 네트워크 기능은 Socket 표준 기반으로 구현되어 있다. C, C++, C#, Java, Python 등 프로그래밍 언어에서 사용하는 네트워크 라이브러리는 내부적으로 Socket 표준을 기반으로 한다. 그 중, 가장 기반이 되는 Low level Socket API 는, C언어 POSIX library 에 포함된 된 이다. 프로그래밍 언어마다 사용법이 상이한 네트워크 라이브러리 제공하더라도, Socket 을 조금 더 편리하게 사용하도록 발전된 형태의 라이브러리들에 불과하다. 그렇기에 C#, Java, Python 도 C언어의 Low level Socket API 와 비슷한 구현이 가능한 방법을..