• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

리시브 비동기에 관련하여 궁금한 것이 있습니다.

22.02.05 10:33 작성 조회수 162

0

private static void OnAccepted(Socket clientSocket)

        {

            session.Start(clientSocket);

 

            byte[] sendBuff = Encoding.UTF8.GetBytes("Hello Server!");

            session.Send(sendBuff);

 

            Thread.Sleep(1000);

 

            session.Disconnect();            

        }

 

해당 부분에서 소켓의 접속이 정상적으로 성공하여 해당 함수가 실행되고 session.Start에서 리시브 작업을 시작하고

비동기니간 바로 다른 작업으로 넘어가서 동작하다 메시지가 오면 연결되어있던 출력해주는 함수가 실행되고 출력후 다시

ResisterRecv를 실행하여 다시 또 비동기로 받을준비하고 이렇게 비동기로 클라이언트가 접속을 끊고 다시 재연결 하기 전까지는 반복으로 알고 있습니다.

 

그런데 여기서 궁금한게 위에 코드에서 Send 밑에 Hello라는 메시지를 그냥 콘솔에 출력해주는 코드 한 줄 넣고 클라이언트에서 예제에서는 5번 보내도록 되어 있는 것을 10만번으로 늘린 후 실행해보면 제가 예상한 결과는 10만번 보내는 도중에 위의 코드에서 Start에서 메시지 받는 것은 비동기니 받아지는 도중에 Send 진행되고 밑의 Hello 출력되고 접속이 끊긴다고 알고 있었는데 그렇지 않아 여쭤봅니다.

그러면 비동기하고 동기하고 차이가 없는 것 같아 여쭤봅니다. 

답변 1

답변을 작성해보세요.

0

비동기니간 바로 다른 작업으로 넘어가서 동작하다 메시지가 오면 연결되어있던 출력해주는 함수가 실행되고 출력후 다시

-> 다만 다른 쓰레드에서 실행할 수도 있습니다.

그런데 여기서 궁금한게 위에 코드에서 Send 밑에 Hello라는 메시지를 그냥 콘솔에 출력해주는 코드 한 줄 넣고 클라이언트에서 예제에서는 5번 보내도록 되어 있는 것을 10만번으로 늘린 후 실행해보면 제가 예상한 결과는 10만번 보내는 도중에 위의 코드에서 Start에서 메시지 받는 것은 비동기니 받아지는 도중에 Send 진행되고 밑의 Hello 출력되고 접속이 끊긴다고 알고 있었는데 그렇지 않아 여쭤봅니다.

->
여러번 읽어봤는데 질문이 잘 이해가 안갑니다 OTL

일단 Hello 출력하는 것은 아무런 상관이 없고
Thread.Sleep(1000);처럼 1초 대기하는걸 빼고 바로
session.Disconnect()를 시켜주면 10만번의 패킷이 다 못올 가능성이 높습니다.
비동기로 호출해준 상태에서, Recv가 실제로 완료되면
별도의 쓰레드에서 실행될 수 있기 때문에 
Send 호출하는 쓰레드와, Recv 처리하는 쓰레드는 병행해서 처리될 수 있습니다.

BDK님의 프로필

BDK

질문자

2022.02.06

제가 너무 풀어서 쓴 것 같아서 간단하게 요약하자면

recv는 비동기처리니간 다른 쓰레드에서 돌아가고 send는 아직 동기니간 메인쓰레드에서 동작하고

그러니 Start로 시작하고 비동기에서 돌아가는 recv는 알아서 다른 쓰레드에서 돌아가고 있으니 10만번의 메시지가 오면 계속해서 다른 쓰레드에서 출력해주고 그것과 상관없이 병렬로 메인 쓰레드에서 돌아가고 있는 send가 다른 쓰레드에서 recv되고 있는 와중에 send가 실행되고 send 바로 밑에 있는 Hello라는 추가한 테스트 코드가 출력되야하는데 recv가 10만번 다 끝난 상태에서 출력된다는 말씀이였습니다.  병렬 처리니간 recv가 되는 와중에 메시지가 출력이 되야 하지 않나요?

BDK님의 프로필

BDK

질문자

2022.02.06

아, 우선 제가 네트워크 관련 블락, 논블락을 잘 몰라서 그러는데요.

정의가 먼저 필요할 것 같아서요.

혹시 Accept, Receive, Send 모두 동기라고 가정하면

 

Accept를 하면 클라이언트가 접속을 시도 하기 전까지는 계속 Accept에서 대기

Receive를 하면 클라이언트에서 메시지를 Send 하기 전까지 계속 Receive에서 대기

Send를 하면 클라이언트에서 Receive 하기 전까지 계속 대기 

 

위에 내용이 맞는건가요?