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

딩동댕님의 프로필 이미지
딩동댕

작성한 질문수

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

Listener

리스너 코드 무반응

작성

·

338

0

소켓프로그래밍2에서 하시는 가장 기본적인 클라와서버 소통방식을 구현할때는 패킷을 잘 주고 받았는데 Listenr비동기방식을 구현하고 나서는 서버에서는 OnAcceptHandler로 안넘어가고 클라에서는 받는 패킷에서 멈추더라구요(디버그중 일시정지를해보니)

코드도 잘못된게 없고 오류도 안뜨고... 무슨문제일까요??

답변 10

1

굉장히 늦은 답변이지만 저도 mac환경에서 동일 현상을 겪었습니다

그냥 진행하면 client의 recv에서 멈춰서 대기하면서 netstat으로 확인하면 클라이언트는 서버에 연결되어있다고 하지만 서버는 클라이언트를 받아오지 못하고 있더라구요. Completed 이벤트 발생도 되지 않구요. 따라서 OnAcceptCompleted 함수가 실행되지 않고 있었습니다.

디버깅 모드로 AcceptAsync에 중단점을 찍으면 Blocking이 true인 상태로 AcceptAsync는 false를 반환하면서 강제로 OnAcceptComplited 함수가 실행되어 client와 server가 통신하구요.

client를 sleep시켜도 보고 구글링을 해보고 스택오버플로우에서 찾아본 방법으로도 해결이 안 되길 며칠... 우연히 AcceptAsync 정보를 가져와볼 심산으로 Server의 Program 파일에서 _listener.Init 이후 잠깐 sleep을 걸었더니 잘 소통하네요... 이후 반복 테스트에서 모두 성공했습니다.

정확한 원인은 모르겠지만... 여튼 문제 해결은 되었습니다

Server가 잠깐 sleep해야한다는게 client와의 통신 상에 성능 저하가 발생할 수밖에 없을 것 같아 찝찝하기에 원인을 더 고민해볼 계획입니다

 

+ 가끔가다 중간에 멈추는 경우가 있었습니다. while문 앞의 Thread.Sleep()에서 sleep 시간이 짧을수록 더 잘 멈추더라구요

고민하다 while문 안에서 sleep를 선언하니 만큼만 sleep를 설정하여도 멈춤 없이 작동합니다 심증적으로는 mac의 정책이나 mac용 VS의 문제로 while문이 도는 동안 이벤트 발생을 못하고 있다는 것인데... 정확한 이유는 저도 잘 모르겠네요 ㅠ

일단 작동을 하니 다음으로 넘어가야겠습니다... 만으로 하루를 매달렸는데 막상 일단 작동하는 이유를 보니 허탈하기도 하네요;

다른 분들도 도움이 되길 바라며 남겨봅니다

1

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

윈도우 환경 구성이 힘들고
macOS에서 AcceptAsync'만' 문제라면
저 부분은 원래대로 동기 함수로 놔두고  코드를 조금 수정해서 진행하는 것도 방법일 것 같습니다.

1

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

보내주신 파일을 실행해보니 제 환경에서는 너무 잘 실행되네요 (ㅎㅎㅎ...)
위와 같이 [From Client]도 아예 안 뜨는걸까요?

그리고 혹시 리눅스나 Mac에서 실행중이신건지도 확인 부탁드립니다.

1

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

말씀주신 내용만으로는 알기 힘듭니다.

[코드 잘못된게 없다]는 의미가 제가 올려놓은 코드로
동일하게 테스트를 했는데도 동일하게 접속이 안된다는 말씀일까요?

문제는 없는데 OnAcceptHandler로 넘어가지 않는다면
정말 클라가 붙지 못해서 그런것일 확률이 높은데
환경에 따라 DNS에서 받아오는 IP 주소가 이상이 있어서 그런 케이스를 한 번 봤습니다.

위와 비슷하게 "127.0.0.1"과 "7777"과 같이
DNS 사용하지 않고 IP/포트로 대체해도 연결이 안 되는지 확인 바랍니다.

그래도 해결이 안되면 rookiss@naver.com로 압축해서 보내주시면
제 환경에서도 문제가 재현되는지 확인을 해보겠습니다.

0

딩동댕님의 프로필 이미지
딩동댕
질문자

그렇군요 ㅠㅠ 일단 콘솔에 출력되는 로그는 한개도 없네요... try를 감싸도 

이 환경문제는 구글링이나 커뮤니티에 물어봐도 정보가 없더라구요. 정 안되면 윈도우로 넘어가야하겠죠?..

0

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

환경에 따라 발생하는 버그는 저도 원인을 파악하기가 힘듭니다.
특정 버전 특정 함수의 버그일 수도 있지만
OS 세팅에 따른 문제일 수도 있고 정말 원인이 다양하기 때문입니다.
그래서 강의도 Windows 기준으로만 진행하고 있습니다.

그나마 Part7 코드가 실행된다면 '뭔가'를 고치면 될거라는 희망은 있네요.

일단 단서를 얻기 위해 클라 쪽과 서버쪽 RegisterAccept 코드에서 어떤 에러라도 뱉는지
try catch 로 감싸 로그를 출력해보시기 바랍니다.

0

딩동댕님의 프로필 이미지
딩동댕
질문자

파트4마지막소스는 안되네요.. 파트7은 분명 잘되는데..

dns 부분을 아이피주소를 적는걸로 변경해봐도 안됩니다

해결방안이 없는건가요?

0

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

Mac에서는 AcceptAsync 트리거가 안되는 질문이 이전에도 하나 올라왔는데
아마도 환경에 따른 버그로 예상되지만,
제가 테스트를 해볼 수가 없어서 난감하군요.

신기하게 파트7 마지막 소스는 되었다고 하시는데
혹시 파트4 마지막 테스트 소스는 실행이 될까요?
클라에서 비동기 Connect를 하면 또 Mac에서도 동작 한다거나..
하는 부두술이 필요한 시점이네요.

0

딩동댕님의 프로필 이미지
딩동댕
질문자

제 환경은 mac이긴한데 파트7 마지막소스와 클라연결테스트(게임멀티플레이어이동)를 다운받아서 해봤는데 이거는 잘되더라구요

서버는 Listening... 이거 출력말고는 가만히 있고여

클라는 connected 문구 하나 출력말구는 반응이 없습니다.

0

딩동댕님의 프로필 이미지
딩동댕
질문자

소켓프로그래밍2를 할때도 

string ip = "127.0.0.1";

            int port = 7777;

            IPAddress ipAddr = IPAddress.Parse(ip);

            IPEndPoint endPoint = new IPEndPoint(ipAddr, port);

이런 코드를 쓰고있었습니다 

메일 보내드렸습니다.

딩동댕님의 프로필 이미지
딩동댕

작성한 질문수

질문하기