본문 바로가기
UNITY/네트워크

[네트워크] TCP/IP 비동기 통신 함수

by 램플릿 2025. 6. 12.

 

Asynchronous TCP/IP 통신 함수

 

  Asynchronous TCP/IP 통신 함수   

TCP/IP 통신을 위한 클래스들을 제공하는 네임스페이스 System.Net.Sockets

- C# 5.0부터 도입된async/await키워드를 사용하면 비동기 코드를 동기 코드처럼 간결하게 작성할 수 있습니다.

 

TcpListener(서버)

  • TcpListener(IPAddress localaddr, int port): 서버가 사용할 IP 주소와 포트에서 클라이언트 연결을 수신할 TcpListener 객체를 생성합니다.
  • Start(): 클라이언트 연결 수신을 시작합니다.
  • AcceptTcpClientAsync(): 클라이언트로부터 온 리퀘스트(연결 요청)를 비동기적으로 수락하고, await 키워드와 함께 사용하여 연결된 TcpClient객체(윈속에서는 소켓)를 얻습다. 연결이 수락될 때까지 대기하지 않습니다 (Non-blocking) .
  • Stop(): 클라이언트 연결 수신을 중지합니다.

 

TcpClient(클라이언트, 서버)

  • TcpClient(string hostname, int port): 지정된 호스트 이름(또는 IP 주소)과 포트 번호를 사용하여 서버에 연결하는TcpClient객체를 생성합니다. 연결이 성공할 때까지 대기(blocking)합니다.
  • ConnectAsync(string hostname, int port): 지정된 호스트 이름(또는 IP 주소)과 포트 번호를 사용하여 서버에 비동기적으로 연결을 시도합니다. await 키워드와 함께 사용합니다.연결될 때 까지 대기하지 않습니다 (Non-blocking) .
  • GetStream(): 클라이언트와 서버 간의 데이터 송수신에 사용되는 NetworkStream객체를 가져옵니다.
  • Close(): TcpClient연결을 닫습니다.

 

NetworkStream(클라이언트, 서버)

  • ReadAsync(byte[] buffer, int offset, int size, CancellationToken cancellationToken): 스트림에서 데이터를 비동기적으로 읽어 buffer배열에 저장합니다. await 키워드와 함께 사용합니다.
  • WriteAsync(byte[] buffer, int offset, int size, CancellationToken cancellationToken): buffer배열의 데이터를 스트림에 비동기적으로 씁니다. await 키워드와 함께 사용합니다.
  • ReadAsync와 WriteAsync는 CancellationToken(비동기작업 취소)을 사용하지 않는 오버로드도 존재합니다.
    (오버로드 : 메서드 이름은 같지만, 매개변수(파라미터)가 다른 여러 버전을 정의하는 기능)
  • Close(): 명시적으로 NetworkStream을 닫습니다.
  • Dispose(): 리소스를 해제하여 자원을 정리함. 주로 Dispose()룰 직접 호출하기보다는 using구문을 활용함. e.g.) using( TcpClient client = new TcpClient() ){ //자동으로 client.Dispose() 호출됨 }

 

UdpClient(클라이언트, 서버):

  • UdpClient(Int32): 지정된 포트에서 수신 대기하는UdpClient객체를 생성합니다.
  • UdpClient():UdpClient객체를 생성합니다.
  • SendAsync(Byte[], Int32, IPEndPoint): 지정된 엔드포인트에 데이터를 비동기적으로 보냅니다.
  • ReceiveAsync(): 데이터를 비동기적으로 수신합니다.

 

 

  APM 방식 (Asynchronous Programming Model)   

.NET Framework 초기부터 사용되던 전통적인 비동기 프로그래밍 방식. 이후로는 async/await 방식으로 바뀌었다.

Begin~~~메서드로 비동기 작업을 시작하고, End~~~메서드로 결과를 얻거나, 콜백 함수를 사용하여 작업 완료를 처리합니다. 

 

TcpListener(서버):

• BeginAcceptTcpClient(AsyncCallback callback, object state): 클라이언트 연결 요청을 비동기적으로 수락합니다. callback은 연결이 수락되었을 때 호출될 콜백 함수입니다.
• EndAcceptTcpClient(IAsyncResult asyncResult): 비동기 연결 수락 작업의 결과를 가져옵니다. BeginAcceptTcpClient가 반환한 IAsyncResult객체를 사용합니다.

 

TcpClient(클라이언트):

• BeginConnect(string host, int port, AsyncCallback requestCallback, object state): 서버에 비동기적으로 연결을 시도합니다.  requestCallback은 연결 시도 결과에 따라 호출될 콜백 함수입니다.
• EndConnect(IAsyncResultasyncResult): 비동기 연결 시도 작업의 결과를 가져옵니다. BeginConnect가 반환한 AsyncResult객체를 사용합니다.

 

NetworkStream(클라이언트, 서버):

• BeginRead(byte[] buffer, int offset, int size, AsyncCallbackcallback, object state): 스트림에서 데이터를 비동기적으로 읽습니다.callback은 읽기 완료 시 호출될 콜백 함수입니다.
• EndRead(IAsyncResultasyncResult): 비동기 읽기 작업의 결과를 가져옵니다.BeginRead가 반환한IAsyncResult객체를 사용하며, 읽은 바이트 수를 반환합니다.
• BeginWrite(byte[] buffer, int offset, int size, AsyncCallbackcallback, object state): 스트림에 데이터를 비동기적으로 씁니다.callback은 쓰기 완료 시 호출될 콜백 함수입니다.
• EndWrite(IAsyncResultasyncResult): 비동기 쓰기 작업의 결과를 가져옵니다.BeginWrite가 반환한IAsyncResult객체를 사용합니다.


UdpClient

• BeginSend(Byte[], Int32, IPEndPoint, AsyncCallback, Object): 데이터를 비동기적으로 보냅니다.
• EndSend(IAsyncResult): 데이터가 보내졌는지 확인합니다.
• BeginReceive(AsyncCallback, Object): 데이터를 비동기적으로 받습니다.
• EndReceive(IAsyncResult, ref IPEndPoint): 받은 데이터를 가져옵니다.


AsyncCallback 델리게이트

비동기 작업이 완료되었을 때 호출될 콜백 메서드를 정의합니다.IAsyncResult객체를 매개변수로 받습니다.