입출력 작업은 블로킹(blocking) 또는 논블로킹(Non-blocking)방식으로 수행된다.
1. 블로킹(Blocking)
블로킹 방식에는 입출력 작업이 완료될 때까지 호출한 함수가 대기한다. 입출력 함수가 호출되면, 작업이 완료되기 전까지 호출한 쓰레드는 정지하고 블로킹된다.
장점
코드를 단순하게 작성할 수 있고 동기적인 동작이 필요한 경우 유용하다.
단점
여러 작업을 동시에 처리해야 하는 경우 다른 쓰레드를 사용해야 하며, 블로킹 호출은 전체 시스템 처리량을 감소시킬 수 있다.
blocking방식 이용한 Server코드
대표적인 블로킹 함수
01 Send
public int Send(byte[] buffer);
02 Receive
public int Receive(byte[] buffer);
03 Conncect
public void Connect(EndPoint remoteEP);
2. 논블로킹(Non-blocking)
논블로킹 방식에서는 입출력 작업이 완료되지 않더라도 호출한 함수가 즉시 반환된다. 이를 사용하면 대기하지 않고 다른 작업을 수행할 수 있다. 이벤트 또는 콜백을 사용하여 작업 완료를 처리 해야 한다.
장점
여러 작업을 동시에 처리할 수 있으며, 전체 시스템 처리량을 향상시킬 수 있다.
단점
비동기에 대한 이해가 많이 필요하다.
Non-blocking방식 이용한 Server코드
대표적인 논블로킹 함수
01 BeiginSend
public IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state);
매개변수
buffer : 전송할 데이터를 담고 있는 버퍼
offset : 버퍼에서 전송을 시작할 위치
size : 전송할 최대 데이터 크기
socketflags : 전송에대한 특정 socketflag
callback : 비동기 작업이 완료되었을때 호출될 콜백 메서드
state : 비동기 작업과 관련된 상태 정보를 나타내는 개체
반환
IAsyncResult : 비동기 작업과 관련된 상태 정보를 포함하는 인터페이스
02 BeginReceive
public IAsyncResult BeginReceive(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state);
매개변수
buffer : 수신한 데이터를 담고 있는 버퍼
offset : 버퍼에서 수신을 시작할 위치
size : 수신할 최대 데이터 크기
socketflags : 수시에 대한 특정 socketflag
callback : 비동기 작업이 완료되었을때 호출될 콜백 메서드
state : 비동기 작업과 관련된 상태 정보를 나타내는 개체
반환
IAsyncResult : 비동기 작업과 관련된 상태 정보를 포함하는 인터페이스
03 BeiginConnect
public IAsyncResult BeginConnect(EndPoint remoteEP, AsyncCallback callback, object state);
매개변수
remoteEP : 원격 버서의 엔드포인트
callback : 비동기 작업이 완료될때 호출되는 콜백
state : 사용자 지정 상태 개체, 콜백 메서드에서 사용될 수 있다.
반환
IAsynResult : 비동기 작업의 상태와 진행 상황을 나타내는 개체
SocketAsyncEventArgs
비동기 소켓 작업을 수행하기 위해 사용되는 클래스이다. 이를 사용하면 미리 생성된 객체를 재사용할 수 있다는 장점이 있다. 이 객체는 비동기 작업에 대한 매개변수, 결과 및 콜백 정보를 저장할 수 있다.
01 AcceptAsync
비동기적으로 클라이언트의 연결 요청을 받는 socket작업을 수행한다.
public bool AcceptAsync(SocketAsyncEventArgs e);
02 SocketError
비동기 소켓 작업의 결과를 가져오거나 설정한다.
public SocketError SocketError { get; set; }
결과가 성공적인 경우 SocketError.Success가 반환된다.
03 SocketAsyncEventArgs.Completed
SocketAsyncEventArgs의 이벤트로 비동기 소켓의 작업이 완료되었을 때 발생한다. 소켓 작업의 완료 상태를 감지하고 처리할 수 있다.
public event EventHandler<SocketAsyncEventArgs> Completed;
'cs공부 > 네트워크프로그래밍' 카테고리의 다른 글
네트워크 프로그래밍 - C# Non - blocking을 사용한 Server 소켓프로그래밍의 Receive (0) | 2023.07.03 |
---|---|
네트워크 프로그래밍 - non-blocking code에 대해 더 알아보기 (0) | 2023.07.03 |
네트워크프로그래밍 - C# Non - blocking을 사용한 Server 소켓프로그래밍의 Listener (0) | 2023.06.21 |
네트워크 프로그래밍 - C# 간단한 blocking 사용한 Server 소켓프로그래밍 구현 (0) | 2023.06.19 |
네트워크 프로그래밍 - C# 간단한 Client 소켓프로그래밍 구현 (0) | 2023.06.19 |
댓글