🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

OnRecvCompleted 내 RegisterRecv를 다시하는 이유가 먼가요?

24.05.26 15:01 작성 24.05.26 15:10 수정 조회수 109

0

좋은 강의 우선 너무 감사드립니다. ㅜㅜ

23:34 이후 부터 Recv 관련 내용을 듣다가 궁금한 부분이 있어서 질문드립니다.

(1)
OnAcceptHandler의 전체 코드를 살펴보면 클라이언트와 접속이 된 이후 수신 / 송신 이후 클라와의 연결을 끊어버리는데 (session.Disconnect() -> Shutdown, Close),

OnRecvCompleted 내 RegisterRecv를 다시하더라도 클라쪽에서 보내는 데이터를 미처 다 수신받기 전에 끊겨질수 있지 않나요?

서버가 클라와의 연결을 끊을려고 할때 (Shutdown, Close) 클라쪽에서 보낸 데이터가 남아 있을 경우 바로 끊지 않고 비동기 수신 함수로 등록된 결과를 모두 처리하고 끊는걸로 이해하면 될까요?

 

(2) 다시 낚시대를 던지는 행위 ? 가 결국은 클라와 연결이 된 이후
클라쪽에서 한번에 여러개의 패킷을 send를 하기 때문으로 이해가 되는데, 만약 클라가 연결이 된 이후 한 개의 패킷만 전달한다는 정책이라면 따로 OnRecvCompleted 내 RegisterRecv를 하지 않아도 될까요?



답변 2

·

답변을 작성해보세요.

0

이영호님의 프로필

이영호

질문자

2024.05.26

답변 감사합니다.

0

(1)
OnAcceptHandler의 전체 코드를 살펴보면 클라이언트와 접속이 된 이후 수신 / 송신 이후 클라와의 연결을 끊어버리는데 (session.Disconnect() -> Shutdown, Close),
OnRecvCompleted 내 RegisterRecv를 다시하더라도 클라쪽에서 보내는 데이터를 미처 다 수신받기 전에 끊겨질수 있지 않나요?
서버가 클라와의 연결을 끊을려고 할때 (Shutdown, Close) 클라쪽에서 보낸 데이터가 남아 있을 경우 바로 끊지 않고 비동기 수신 함수로 등록된 결과를 모두 처리하고 끊는걸로 이해하면 될까요?

-> 클라가 끊는건 특이한 경우이고 지금은 예시를 위해 그렇지만 나중에는 쭉 연결을 유지하게 됩니다.

 

(2) 다시 낚시대를 던지는 행위 ? 가 결국은 클라와 연결이 된 이후
클라쪽에서 한번에 여러개의 패킷을 send를 하기 때문으로 이해가 되는데, 만약 클라가 연결이 된 이후 한 개의 패킷만 전달한다는 정책이라면 따로 OnRecvCompleted 내 RegisterRecv를 하지 않아도 될까요?

아뇨 그렇다고 해도 TCP 특성상 패킷이 한 번에 온다는 보장이 없어서
OnRecv -> Register 반복 작업은 항상 있어야 합니다.
만약에 연결이 끊어진다면, 그건 그거대로 Recv할 때 0바이트 수신이 뜹니다.

채널톡 아이콘