inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

유니티 연동 #2

질문 있습니다

144

강감찬

작성한 질문수 11

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바이트를 보내고 연결이 끊기는 지를 도저히 모르겠습니다.. 질문이 다소 두루뭉실해서 명확한 답변을 받긴 어렵겠지만, 감이 아예 안잡혀서 어디가 문제일지 예측이 너무 힘드네요. 어디가 문제일지 예측하는 방향성이라도 알려주시면 감사 할 것 같습니다 또는 처음부터 다시 하는게 더 빠를까요..

C# unity 네트워크

답변 2

0

Rookiss

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

0

인프런 AI 인턴

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

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

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

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

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

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

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

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

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

C#에서의 RAII

0

142

3

TLS 질문드립니다.

0

117

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

123

2

Unity Span

0

145

2

XML, Dll 차이점

0

182

2

Session 질문입니다

0

130

1

Write Read 커서 키워드

0

115

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

125

2

네트워크 Send 전담 스레드 배치

0

153

2

UnhandledException 으로 서버 터지는 경우

0

191

2

컨텐츠 단, 엔진 단

0

151

1

C# 게임서버 3D MMORPG

0

206

2

유니티6 버전

0

145

2

receive하는 부분과 send하는 부분의 차이

0

193

2

커서의 위치의 중요성

0

148

2

C++ 전혀 모르는데 C# 서버

0

223

2

강의에 질문이 있습니다

0

127

2

멀티스레드 이해도 질문

0

133

1

500 vs 500

0

215

3

OnAcceptHandler 액션 함수

0

100

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

239

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

120

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

140

1

스핀락 질문.

0

141

2