소켓 통신 실행 흐름


VS C# 윈폼 프로젝트 생성하기

 

동기화된 코드의 문제점

더보기
상단의 View 메뉴에서, ToolBox 를 선택합니다.
ToolBox 에서 Button(버튼)을 검색하여, 폼 위에 올려리고, 버튼을 <더블클릭>합니다.
버튼 이벤트가 생성됩니다.
참고: 코드보기(F7)
public void AcceptIncomingSocket()
{
    // (1) 서버 소켓 생성
    Socket listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    // IP 및 포트 설정
    IPAddress ipaddr = IPAddress.Any;
    IPEndPoint ipep = new IPEndPoint(ipaddr, 23000);

    // (2) 소켓 바인딩
    listenerSocket.Bind(ipep);

    // (3) 연결 요청 대기 상태로 전환
    listenerSocket.Listen(5);
    Console.WriteLine("클라이언트 연결을 대기 중입니다...");
    //Debug.WriteLine("클라이언트 연결을 대기 중입니다...");

    // (4) 클라이언트 연결 수락
    Socket client = listenerSocket.Accept();
    Console.WriteLine($"클라이언트가 연결되었습니다: {client.RemoteEndPoint}");
}
서버 구현에 필요한 최소한의 구조를 구현한다.
버튼을 누르면, 동기화된 로직에서 UI 가 멈추는 것을 확인한다.

 


 

Accept( ); 가 실행되지 않고, 입력 대기 상태처럼 블럭된다.

 

메서드  동작  “대기(block)” 발생 여부
listenerSocket.Listen(5) 서버를 “연결 요청 수락 가능한 상태”로 전환  (즉시 반환됨, 대기하지 않음)
listenerSocket.Accept() 실제 클라이언트가 연결 요청할 때까지 대기 ⏸️ 대기(block) 발생

 

비동기 코드 구현 목표

더보기
public async Task AcceptIncomingSocket()
{
    // (1) 서버 소켓 생성
    Socket listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    // IP 및 포트 설정
    IPAddress ipaddr = IPAddress.Any;
    IPEndPoint ipep = new IPEndPoint(ipaddr, 23000);

    // (2) 소켓 바인딩
    listenerSocket.Bind(ipep);

    // (3) 연결 요청 대기 상태로 전환
    listenerSocket.Listen(5);
    Console.WriteLine("클라이언트 연결을 대기 중입니다...");

    // (4) 클라이언트 연결 수락
    Socket client = await listenerSocket.AcceptAsync();
    Console.WriteLine($"클라이언트가 연결되었습니다: {client.RemoteEndPoint}");
}

private async void button1_Click(object sender, System.EventArgs e)
{
    await AcceptIncomingSocket();
}
Task 네임스페이스 추가
버튼 이벤트 비동기로 변경 (이벤트 핸들러는 예외를 전파하지 않기 때문에 async void 가 유일하게 허용됩니다.)
함수이름에 비동기 키워드 추가
버튼을 눌렀을 때, 동작한는 함수의 로직은, UI와 별도의 로직 흐름을 가진 비동기 흐름이 된다.