강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

강감찬님의 프로필 이미지
강감찬

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

유니티 연동 #2

질문 있습니다

작성

·

20

·

수정됨

0

강의와 똑같은 코드로 실습을 하고있는데요, 서버와 유니티의 통신이 되지않아 원인을 찾아보았는데요 (3일동안 찾았습니다..) 원인을 보니

    void OnSendCompleted(object sender, SocketAsyncEventArgs args)
  {
      lock (_lock)
      {
          if (args.BytesTransferred > 0 && args.SocketError == SocketError.Success)
          {
              try
              {
                  _pendingList.Clear();
                  _sendArgs.BufferList = null;
                  // Console.WriteLine($"Send TransferredBytes : {_sendArgs.BytesTransferred}");
                  OnSend(args.BytesTransferred);

                  if (_sendQueue.Count > 0)
                  {
                      RegisterSend();
                  }

              }
              catch (Exception e)
              {
                  Console.WriteLine($"OnSendCompleted Failed : {e}"); // TEMP
              }
          }
          else
          {
              Console.WriteLine($"{args.SocketError}, {args.BytesTransferred}");
              DisConnect();
          }
      }
  }

Session클래스의 OnSendCompleted에서 보낸 바이트수가 0, 소켓에러가 InvalidArgument가 나와서 통신이 끊기고 유니티와 연결이 되지 않더라구요. 그런데 전 0바이트를 보낸적이 없는데 왜 0바이트를 보내고 연결이 끊기는 지를 도저히 모르겠습니다.. 질문이 다소 두루뭉실해서 명확한 답변을 받긴 어렵겠지만, 감이 아예 안잡혀서 어디가 문제일지 예측이 너무 힘드네요. 어디가 문제일지 예측하는 방향성이라도 알려주시면 감사 할 것 같습니다 또는 처음부터 다시 하는게 더 빠를까요..

답변 2

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

0바이트를 보내는 것은 상대방이 연결이 끊길 때 일어나는 행동이라,
Recv 0바이트에 집중하기 보다는 왜 끊겼는지를 봐야 합니다
클라 쪽에서 접속는 잘 되었는지를 확인해봐야 할 것 같네요.
그리고 강의 전체 소스를 실행해도 동일한 문제가 발생하는지 보고
그렇지 않으면 하나씩 복붙 잡업을 해보세요

0

안녕하세요, 인프런 AI 인턴입니다. 강감찬님.

서버와 유니티 간의 통신이 끊기는 문제로 고민 중이시군요. 현재 OnSendCompleted 메서드에서 args.BytesTransferred 값이 0이며 SocketErrorInvalidArgument로 나타나는 상황인데요. 이러한 문제는 여러 원인이 있을 수 있습니다. 몇 가지 가능한 원인과 해결책을 제시해 드리겠습니다.

  1. 전송할 데이터의 크기: Args.BytesTransferred가 0이라면 실제로 전송된 데이터가 없다는 것을 의미합니다. 먼저 확인해야 할 것은 _sendQueue에 데이터가 제대로 포함되어 있는지입니다. 데이터가 하드웨어 레벨에서 올바르게 설정되지 않았거나, _sendQueue에서 올바른 엔트리가 빠져나가지 않았을 가능성이 있습니다.

  2. 소켓 설정 확인: InvalidArgument 에러는 소켓 관련 설정이 잘못되었을 때 발생할 수 있습니다. 특히 소켓이 이미 닫혔다거나 올바르게 연결되지 않은 경우 이런 에러가 생길 수 있습니다. 소켓이 정상적으로 열려 있고, 올바른 포트와 주소로 설정되었는지 확인해보세요.

  3. 이전 연결 상태: 코드에서는 DisConnect()를 호출하며 연결을 끊고 있지만, 이전에 어떤 상황이 발생하면서 연결 상태가 불안정하게 되었는지도 확인이 필요합니다. args.SocketError나 네트워크 상태에 따라 다양한 원인이 있을 수 있어서, 로그를 통해 에러 전후의 시스템 상태를 더 자세히 추적할 수 있도록 하는 것이 좋습니다.

  4. 동시성 문제: 멀티 스레드 환경에서는 경쟁 상태가 발생할 수 있습니다. _lock 객체를 이용해 임계영역을 보호하고 있지만, 이 부분에 문제가 없는지 다시 점검해보실 것을 권장드립니다.

비슷한 질문과 답변들 중 참고할만한 링크를 공유드립니다. 이 질문들은 네트워크 관련 특정 문제에 대한 해결 방법을 다루고 있어 도움이 되실 수 있습니다:

제가 제공하는 정보가 문제가 해결되는데 도움이 되길 바랍니다. 문제가 계속 지속될 경우에는 코드 또는 환경설정을 처음부터 다시 살펴보는 것도 좋은 방법일 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

강감찬님의 프로필 이미지
강감찬

작성한 질문수

질문하기