월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
args.Completed += OnConnectCompleted; 에서 질문 있습니다.
Listener에서는 args.Completed 이벤트에 콜백 함수OnAppectCompleted()를 추가할때 args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAppectCompleted); 위와 같이 구현하셨는데, Connector에서 args.Completed 이벤트에 콜백 함수OnConnectCompleted()를 추가할때 args.Completed += OnConnectCompleted; 로 구현하신 이유가 있을까요??
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
github 관련..
삭제된 글입니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReadOnlySpan 및 Span 관련 질문입니다.
ReadOnlySpan 대신 Span을 이용하되 Span에서도 데이터의 length를 명시할 수 있는 것 같은데요, 굳이 ReadOnlySpan을 사용하는 이유가 있는지 궁금합니다. 데이터를 수정할 일이 없기 때문에 그냥 안전하게 넣고자 하는 의도로 넣어주신건가요? 또 Span 및 ReadOnlySpan을 이용하는 이유는 ArraySegment에 비해 더 안전(?)하게 동작하기 때문인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Action<Socket>에 대해 질문있습니다.
Action<Socket>에 대해 나름대로 공부해봤는데 이해가 잘 안돼서 여쭤봅니다ㅠㅠ 1. "매개변수는 Socket 하나만 갖고 반환값은 없는 메서드를 참조하는 델리게이트" 라고 이해했는데 맞나요? 2._onAcceptHandler.Invoke(args.AcceptSocket);에서 Invoke는 뭘 해주는 함수인가요? 1번처럼 이해한게 맞다면 그냥 _onAcceptHandler(args.AcceptSocket);로 호출해도 될거같아서요.(실제로 이렇게 바꿔도 잘 동작하더라구요)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
에러가 발생합니다..
dummyClient측에서 sendAsync를 하려고 할 때.. 에러가 발생합니다. 에러 내용 Unhandled exception. System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Sockets.Socket'. at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken) at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e) at ServerCore.Session.RegisterSend() in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 71 at ServerCore.Session.Send(ArraySegment`1 sendBuff) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Session.cs:line 57 at DummyClient.GameSession.OnConnected(EndPoint endPoint) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/DummyClient/Program.cs:line 20 at ServerCore.Connector.OnConnectCompleted(Object sender, SocketAsyncEventArgs args) in /Users/mini/Desktop/projects/Game/MMO_Server_Tutorial/ServerCore/Connector.cs:line 42 그리고 찍히는 로그가.. 좀 이상한 것 같은데요.. [From Server]: 메시지 OnDisconnected: [fe80::1%1]:7777 OnConnected: [fe80::1%1]:7777 이러고 나서 바로 위 에러가 나버립니다. 도저히 원인을 찾을 수 없을 것 같아서 질문 남겨드립니다..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
좀 사소한 질문이긴 한데 Encoding에 관해 궁금한 게 있습니다.
오늘 배운 내용을 안보고 코딩해보려니까, 보낼 때는 문자열을 바이트로 바꾸는 거나까 Encoding이 맞지만 받을 땐 그 반대 뜻인 Decoding이 맞지 않나...?라는 생각이 듭니다. 그래서 Encoding.UTF8.GetString(...)이 생각이 잘 안나더라구요. 그냥 API가 그렇게 되있으니까 그러려니 하는게 맞겠죠...?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
식당으로 비유? (Receive, Send와 Asynchronization)
나름대로 식당 예시로 비유를 해봤는데요, 제가 정확히 이해한게 맞는지 확인해보고자 질문을 남깁니다. ReceiveAsync가 비동기로 처리되는 상황 : 대기 손님이 없는 경우. 일단 아무나 입장할 수 있도록 준비를 해둔 상태이고, 손님이 등장하면 바로 입장시킴. (`e.Completed` 호출) ReceiveAsync가 동기로 처리되는 상황 : 대기 손님이 있는(많은) 경우. 그냥 존재하는 손님을 바로 입장시킬 수 있음. SendAsync가 비동기로 처리되는 상황 : 음식을 3개 시킨 손님이 있다. 첫 번째 음식 `A`가 나왔는데, 손님이 아직 테이블로 가져가지 못한 경우이다. 손님이 아직 테이블로 음식을 가져가지 못했다고 해서, `A`를 가져갈 때 까지 두 번째 음식 `B`를 내보내지 않고 기다릴 이유가 없으므로 `B`를 카운터에 놓여있는 `A`의 옆에 둔다. (_sendQueue에 Enqueue한다.) SendAsync가 동기로 처리되는 상황 : 음식을 3개 시킨 손님이 음식 `A`가 나온 즉시 곧바로 테이블로 가져가는 데 성공한 경우이다. 감사합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
프로그램 에러 관련 질문...
클라이언트 코드에서 socket.Connect()를 통해 서버와 연결을 시도하는데, 이 부분에서 오류가 발생합니다. System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (61): Connection refused [fe80::1%1]:7777 at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Connect(EndPoint remoteEP) at DummyClient.Program.Main(String[] args) in DummyClient/Program.cs:line 26 ServerCore와 동시에 실행할 때, 서버가 아직 열리지 않은 상태에서 Connect를 시도해서 오류가 나는 경우는 알겠는데, 어떨 때는 빌드 후 컴파일하고나서 계속 위와 같이 Connect 함수에서 에러만 뜨고 연결이 되지 않습니다.. 서버는 정상적으로 Init 함수가 실행되었습니다. 더욱 오리무중인건, 복불복 식으로 어떨 땐 정상적으로 동작하고 어떨 땐 에러가 발생합니다. 그래서 에러가 발생하면 프로그램을 종료시키고, 다시 컴파일시켜봅니다. 에러가 발생하지 않을 때까지요. 제가 원인을 제대로 몰라서 그런 것 같은데요, 혹시 이렇게 무식하게 계속 다시 컴파일하는 방법이 아니고 진짜 에러를 해결하는 방법이 무엇인지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
recvArgs 변수 질문
sendArgs는 멤버 변수로 만들어주셨는데요, recvArgs변수는 그렇게 하지 않는 이유가 혹시 있는지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
비동기와 논블록은 동일한 의미로 생각하고 넘어가도 되나요?
어떤 책에서 보면 비동기와 논블록은 다른 것이라고 설명이 되어 있었는데, 엄밀하게 알고 넘어가야하는 개념은 아닌가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session 클래스에서 Send()함수의 인자를 ArraySegment<byte>로 바꾸는 부분에서 질문 있습니다.
삭제된 글입니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TCP 프로토콜에 대해 더 여쭤보고 싶습니다
OnRecvCompleted 콜백으로 오는 시점이 궁금합니다 커널에서 어느시점에 해당 소켓에 이벤트를 넘겨주는건가요? 수신버퍼에 조금이라도 차있고 해당 프로그램의 소켓의 순서가 되었을 때 프로그램에 넘겨주는건가요? 1. TCP 특성상 데이터 경계가 없다고 얘기해주셨는데, 그럼 어느시점에 프로그램에게 Recv 이벤트를 알려주는건지 궁금합니다. 2. MSS(1460byte) 보다 큰 App Payload를 TCP에 넘기면 TCP에서 패킷을 MTU 크기만큼 쪼게 나눠 보내는 걸로 알고 있는데요 이때에 나눠받을 때 일부분도 수신버퍼에 들어가고 Recv로 오게되나요? 아니면 쪼게진 패킷을 모두 받아야 수신버퍼에 넣고 어플리케이션으로 넘겨주고 이때 OnRecvCompleted 콜백이 호출되나요? 40byte 를 보냈으나 40byte를 그대로 받지 않는다는 부분의 경우의 수를 조금 더 알고싶습니다
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnReceiveCompleted에서 Byte -> String으로 변환 시
버퍼에 담긴 클라이언트가 보내준 문자열 값보다 count를 크게 잡아줄 시(ex: 1024) 이런 식으로 뒤에 ??? 가 붙게 되는데요, 이는 null 문자인가요? 저는 vscode에서 코딩중입니다. 혹여 실행환경 문제라면 신경쓰이진 않는데 뭔가 잘못 처리한건 아닌지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
AsyncAccept 함수 질문드립니다.
AcceptAsync 함수가 갑자기 헷갈려서 개념을 짚어보고자 다시 질문드립니다. 1. AcceptAsync의 반환값이 false : 대기중인 손님이 이미 있어서 문지기가 손님을 바로 입장시킨 경우 2. AcceptAsync의 반환값이 true : 당장 받을 손님이 없어서 입장시킬 준비를 하고 있다가, 나중에 손님이 등장하면 입장시킨 경우 제대로 이해를 했는지.. 좀 헷갈리네요 ㅜㅜ
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버와 클라이언트의 소켓 관련 질문
제가 이해한 것이 맞다면, 서버와 클라이언트는 미리 주어진 주소(예제에서는 자기 컴퓨터의 로컬 주소)가 담긴 endpoint로 초기화된 소켓을 통해 소통을 하고 있는데요, 음식점으로 비유를 하자면 손님도 식당의 전화번호를 알고 있는데, 식당도 이미 손님의 전화번호를 알고 있는 상태인 것 같습니다. 그런데 보통 이런 경우보다는, 손님이 식당에 전화를 걸면 그때서야 식당이 손님의 전화번호를 알고 다시 응답 전화를 해주거나 할텐데요. 즉 로컬 환경에서 정해진 주소가 아니라, 실제로 클라이언트가 서버로 요청을 보내고 서버는 정확히 "요청을 보낸 서버"의 endpoint로 다시 메시지를 보내기 위해서는 Socket 클래스의 생성자 중에서 endpoint없이 SocketType과 ProtocolType으로만 초기화해주는 버전으로 생성하고, Accept로 들어온 클라이언트의 소켓에서 주소를 얻어와서 그 주소로 응답해주는 식으로 구현해야 하는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
프로젝트 생성할 때 나오는 프레임워크가 뭔가요?
.NET Framework, .NET Core 등 고르는게 나오는데 그거는 아무거나 해도 상관이 없을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
선수학습에 대해 문의드립니다.
유니티 강의를 생략하고 이 강의를 수강을 시작했습니다. 마지막에 유니티 연동 부분이 있는데, 그 부분을 빼고 들어도 혹시 문제가 없을까요? 강의 수강하고 혼자 채팅서버 만들어보는 것이 목적입니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TCP와 UDP에 대해 더 여쭤볼 부분이 있습니다!
1. 서버입장에서 TCP 프로토콜로 100byte를 SendAsync()로 전송했을 때, 콜백이 오는 그 시점은 100byte를 모두 클라이언트에게 전송이 완료되었을 때 오는건가요? 100byte를 보내더라도 나뉘어져서 보내진다는 얘기를 해주셔서 여쭤봅니다. SendAsync()를 호출한 이후에 콜백받은 상황이 정확히 어떤 상황인지 여쭤보고 싶습니다. 100byte를 보냈을 때 100byte를 클라이언트가 전부 받았다고 보장되었을 때 콜백이 오는지 알고싶습니다. 2. UDP 프로토콜에서는 해당 부분이 발생하지 않는다고 하셨는데 UDP 프로토콜은 패킷을 보낸 입장에서 상대방의 받는 유무조차 모르기 때문에 시도자체를 통으로 보내는 것이지 받았는지 유무는 전혀모르는거죠?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
상호 배제란?
SpinLock을 구현하다가 궁금해져서 질문 남깁니다. Mutex를 검색해보니 Mutual Exclusion, 즉 상호 배제의 약자더라구요. 검색해본 결과, 임계 구역에 접근하지 못하면 다시 대기 상태로 돌아가야 한다고 되어 있기도 하고, Mutex의 이름도 그렇고 SpinLock은 임계 구역에 하나의 스레드만 접근할 수 있도록 계속 재시도하는 방법인데, 이는 상호 배제가 맞는 것인지, 아닌 것인지 궁금합니다. 개념이 자꾸 헷갈리네요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Monitor 방식과 SpinLock 등 방법들의 관계
lock 키워드와 Monitor는 임계 영역 자체를 만드는 방법에 대한 것이고, SpinLock, Context Switching, Event는 임계 영역을 사용하기 위한 순서를 결정하는 알고리즘이라고 생각해도 되나요? 그리고 Context Switching은 실행중인 스레드가 대기 상태로 돌아가고, 대기중이던 스레드를 실행하기 위해 메모리에 스레드의 상태를 저장 및 적재하는 일련의 과정이라고 말씀해주셨는데요, Context Switching을 사용하여 Lock을 구현하는 방법을 이르는 용어가 따로 있는지 궁금합니다.