no image
MySql : Commands out of sync; you can't run this command now 에러
db커넥션은 하나의 연결을 의미한다. 순차적으로 쿼리를 받음. 하지만 하나의 커넥션으로 여러개의 클라이언트 일을 처리하는 것은 말이 되지 않음. 그래서 기존의 PacketManager의 Init에서 한번만 연결시켜주던 것을 아래 그림처럼 새로운 플레이어가 방에 입장 할 때 마다 sql에 연결시켜 주었다.
2022.12.15
no image
System.Runtime.Serialization.SerializationException: Unable to find assembly 오류
전에 겪었던 오류가 생겨서 그때와 똑같이 dll파일을 유니티에 추가해서 해결할려고 했는데 그래도 여전히 같은 오류가 발생했다. 구글링을 해도 답이 안나와서 삽질을 해대다가 드디어 해결했다. 문제는 dll로 사용하던 패킷 스크립트에 직렬화와 역직렬화를 하는 함수를 같이 넣어놨었는데 그게 문제였었다. 함수들을 지우고 서버와 클라에 직렬화,역직렬화 함수들을 다시 추가해주니 정상적으로 작동 되었다. 패킷 클래스에 존재하던 Serialize,Deserialized 함수를, 이렇게 지워주면 정상작동 하게 되었다. (원인이 뭔진 도대체 모르겠다. 왜 함수를 추가하면 터지는지는 모르겠다 ㅠ)
2022.12.11
no image
Overlapped I/O 모델
소켓은 기본적으로 봉쇄/동기로 만들어진다. 이 모델은 데이터 입출력 부분에서 봉쇄(blocking)된다는 문제점을 가진다. 이런 모델로는 하나의 쓰레드에서 두 개 이상의 소켓을 다루기가 힘들다. 그래서 모델을 바꾸지 않고 두 개 이상의 소켓을 처리 하려면 멀티 쓰레드를 사용하는 수 밖에 없다. 하지만 윈도우 운영체제는 멀티 태스킹을 지원한다. 이는 입출력 모델과는 상관없이, 커널은 여러 소켓으로 부터의 입력을 처리 한다는 의미이다. 단지 이 기능을 봉쇄(blocking)/동기 입출력 모델의 한계로 쓰지 못하는 것일 뿐이다. 이 문제는 입출력 모델을 비동기/봉쇄(blocking) 혹은 비동기/비봉쇄(non-blocking)를 쓰는 것으로 해결할 수 있다. 비동기/봉쇄(blocking) 모델을 사용하는 기술..
2022.08.22
no image
유니티 3D 네트워크 게임(2)
서버는 c++ 클라이언트는 c# 일경우 c++에서 TCHAR[10] packet; ZeroMemory(packet,sizeof(packet)); stringCchCopy(packet,sizeof(packet),_T("12345678")); 이런식으로 문자열은 packet이란 배열에 입력을 하게 되면. packet[8] 과 packet[9]에는 0 값이 들어있게 됨니다. 이걸 패킷으로 전송해서 c#으로 받아 string temp = Encoding.ASCII.GetString(packet); 이렇게 받게 되면. 결과값은 "12345678\0\0" 이렇게 출력된다. 해결방법은 아래 처럼 trim 함수를 사용해주면 된다. string temp = Encoding.ASCII.GetString(packet).tr..
2022.06.03
no image
유니티 3D 네트워크 게임(1)
Serialization(직렬화) : 직렬화는 객체를 저장매체(파일이나 메모리와 같은)에 저장하거나 바이너리(이진) 형태로 네트워크를 통해 전달하기 위해 저장하는 과정. 이 연속된 바이트나 포맷은 다시 원래 객체가 가지고 있던 상태로 객체를 재생성하는데 사용할 수 있다. 이렇게 객체를 직렬화하는 과정을 디플레이팅(deflating)또는 마샬링(marshalling)이라고 부른다. Deserialization(역직렬화) : 직렬화와는 반대로 연속된 바이트로부터 어떤 데이터 구조를 추출해내는 과정을 역직렬화라고 한다. 역직렬화는 인플레이팅(inflating) 또는 언마샬링(unmarshalling)이라 불리기도 한다. MemoryStream : 저장소가 메모리인 스트림을 만든다. 구조체를 직렬화하여 저장할 ..
2022.06.01
no image
IOCP 공부 (3)
Lock 클래스 Thread, 멀티 스레드 프로그래밍은 서버 프로그램에 있어서 기초 중의 기초이다. Thread와 Process의 차이점을 면접 시 묻기도 하는데, 큰 차이점이라면 메모리를 공유하느냐 아니냐의 차이가 있다. 서버 프로그램은 단순히 네트워크 IO 스레드만 사용하지 않는다. 서버에 사용되는 스레드를 나열하자면, Database 쿼리를 연결해서 통신해야 하는 것도 따로 흐름을 달리해야 할 것이고, MMORPG라면 몬스터들의 움직임 또는 각 월드의 객체 관리 쓰레드, 클라이언트가 이상한 짓을 하는지 감시하는 쓰레드, 특정 콘텐츠 시스템 쓰레드 등이 있다. 이런 쓰레드들을 서버프로그래머들이 컨트롤 하여 제어해야한다. 이런 쓰레드들과 같이 붙어다니는 Lock도 같이 제어할 구조체가 필요하면 더욱 좋..
2022.05.05
no image
IOCP 공부(2)
최근 프로그램은 멀티바이트(ANSI CODE)를 잘사용하지 않는다고 한다. ANSI는 오히려 자국어만 표현할 수 있어 게임을 해외로 수출할 때, 큰 골칫거리로 떠오른다. 예를 들어 잘되던 욕설 필터링에도 문제를 일으킬 여지가 있다. 일례로, 일본의 경우, ANSI는 Shift-JIS이라고 불리는데, 이 문자 코드 중 몇몇 문자는 두 번째 바이트에 역 슬래시(\,0x5C)가 들어가기도 한다. 이런 단어들은 자주 사용되는 단어인데, 이런 게 들어갈 때 \처리로 문자열이 깨질 수 있다. 대부분의 게임회사는 C++에서 제공하는 stl string보다는, 직접 만들어 놓은 문자열 클래스를 사용하기도 한다고 한다. C++에서 wchar_t 는 아스키 코드로 표현할 수 없는 국제문자를 다루기 위한 자료형이다. 국제문..
2022.05.02
no image
IOCP 공부(1)
IOCP를 이용한 채팅서버를 만들기 전에 기반이 되는 도구/툴 같은 Util 클래스를 만들 것이다. Precompile이란 일반적으로 하나의 프로젝트에는 C++ Header파일들이 엄청나게 많아지는데, 이를 매번 컴파일할 때마다 모두 컴파일 하면 시간이 오래 걸린다. 그래서 중복으로 포함된 헤더 파일들을 처음 VC가 컴파일하여 .pch 란 파일을 생성하고, 이후 변경이 있을 때만 부분 컴파일 하여 전체 컴파일 시간을 대폭 단축 시켜주는 기능이다. 한마디로 전학생 한 명이 오면, 그 반 출석부만 바꾸지, 학교 전체 출석부를 갱신하지 않는다는 것! precompile을 위해 VC에서는 자동 솔루션 생성할 때 "stdafx.h"를 선언해야 한다. (비주얼 스튜디오 2017부터 "pch.h"로 이름이 바뀐거 같..
2022.04.30
no image
네트워크 질문과 답변
유저당 스레드 1개가 맞다. 하나의 유저를 처리하는동안 다른 유저가 기다리면 랙이 발생한다. 유저 하나당 스레드 하나가 있어야 스레드가 무슨 작업을 하든 상관없이 다른 유저의 처리를 response 해줄 수 있기 때문. 이를 워커스레드 방식이라고 해서 요청이 들어오면 워커 스레드 하나를 할당해서 작업을 처리. 로직 스레드... 네트워크 스레드... 등 용도별로 스레드를 설계 한 로직 스레드에서 이벤트가 발생했을때 여러 클라이언트에게 동시에 보낼 수 있게 된다. 네트워크 리드하는 스레드가 소켓을 퍼오고 큐를 통해 로직스레드로 전달 전달 받은 로직스레드는 이벤트가 생기면 이벤트를 처리한다. 클라이언트 - 로직 스레드와 연결 서버는 네트워크 스레드와 연결 서버의 네트워크 스레드에서 로직 스레드로 이벤트를 보내..
2022.04.29