├── README.md ├── auto_test ├── .gitignore ├── AutoDummyClient │ ├── .editorconfig │ ├── .gitignore │ ├── ActionTimeChecker.cs │ ├── AutoTestClient.csproj │ ├── AutoTestClient.sln │ ├── Dummy │ │ ├── DummyAction.cs │ │ ├── DummyBase.cs │ │ ├── DummyGame.cs │ │ ├── DummyManager.cs │ │ ├── DummyNetwork.cs │ │ ├── DummyObject.cs │ │ └── DummyRoom.cs │ ├── ErrorCode.cs │ ├── Monitor.cs │ ├── Network │ │ ├── CustomSocket.cs │ │ ├── PacketFactory.cs │ │ ├── PacketProcessor.cs │ │ ├── ReceiveBuffer.cs │ │ ├── ReceivePacketInfo.cs │ │ ├── Receiver.cs │ │ └── S2CPacketHandler │ │ │ ├── BaseHandler.cs │ │ │ ├── NotifyGameStart.cs │ │ │ ├── NotifyPutStone.cs │ │ │ ├── NotifyRoomChat.cs │ │ │ ├── NotifyRoomLeaveUser.cs │ │ │ ├── NotifyRoomNewUser.cs │ │ │ ├── NotifyRoomUserList.cs │ │ │ ├── ResponseGameStart.cs │ │ │ ├── ResponseLogin.cs │ │ │ ├── ResponsePutStone.cs │ │ │ ├── ResponseRoomEnter.cs │ │ │ └── ResponseRoomLeave.cs │ ├── OmokBoard.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── RoomNumberAllocator.cs │ ├── Scenario │ │ ├── OnlyConnect.cs │ │ ├── OnlyPlayGame.cs │ │ ├── RepeatConnect.cs │ │ ├── RepeatLogin.cs │ │ ├── RepeatRoomEnterChat.cs │ │ ├── RepeatRoomEnterLeave.cs │ │ └── ScenarioBase.cs │ ├── ScenarioConfigFile │ │ ├── OnlyConnect.json │ │ ├── OnlyPlayGame.json │ │ ├── RepeatConnect.json │ │ ├── RepeatLoginOut.json │ │ ├── RepeatRoomEnterChat.json │ │ └── RepeatRoomEnterLeave.json │ ├── ScenarioResult.cs │ ├── ScenarioRunner.cs │ ├── ScenarioRunnerConfig.cs │ └── ScenarioType.cs ├── CSCommon │ ├── .editorconfig │ ├── .gitignore │ ├── CSCommon.csproj │ ├── CSCommon.sln │ ├── ErrorCode.cs │ ├── FastBinaryRead.cs │ ├── FastBinaryWrite.cs │ ├── PacketDatas.cs │ ├── PacketHeader.cs │ └── PacketID.cs ├── Images │ ├── AutoTestClient.drawio │ ├── add_scenario │ │ ├── step_01.png │ │ ├── step_02.png │ │ └── step_05.png │ ├── dummy_login_action.png │ ├── dummy_wait_flag.png │ ├── dummy_wake.png │ ├── dummymgr_action.png │ ├── excute.png │ ├── rebuild.png │ ├── response_login.png │ ├── scenario_base_action.png │ ├── scenario_base_conn_login_disconn_action.png │ ├── scenario_config.png │ ├── scenario_config_file.png │ ├── scenario_runner_blocked.svg │ ├── scenario_runner_mapping.png │ ├── scenario_runner_running.svg │ ├── scenario_switch.png │ ├── task_delay.png │ ├── task_delay.svg │ ├── task_run.png │ ├── thread_structure.svg │ └── wake_response_login.png └── README.md ├── auto_test2 ├── AutoTestClient.csproj ├── AutoTestClient.sln ├── AutoTestMonitor.cs ├── CSCommon │ ├── CSCommon.csproj │ ├── CSCommon.sln │ ├── ErrorCode.cs │ ├── FastBinaryRead.cs │ ├── FastBinaryWrite.cs │ ├── PacketDatas.cs │ ├── PacketHeader.cs │ └── PacketID.cs ├── DTasks │ ├── DTask.cs │ ├── DTaskChat.cs │ ├── DTaskConnect.cs │ ├── DTaskDisconnect.cs │ ├── DTaskEnterRoom.cs │ ├── DTaskLeaveRoom.cs │ ├── DTaskLogin.cs │ ├── DTaskManager.cs │ ├── DTaskResult.cs │ ├── DTaskTestEndCheck.cs │ └── RoomNumberAllocator.cs ├── Dummy │ ├── DAction.cs │ ├── DNetwork.cs │ ├── DResult.cs │ ├── DummyManager.cs │ ├── DummyObject.cs │ ├── DummyState.cs │ └── RunTimeData.cs ├── ErrorCode.cs ├── Network │ ├── CustomSocket.cs │ ├── PacketData.cs │ ├── PacketDefine.cs │ ├── PacketFactory.cs │ ├── PacketProcessor.cs │ ├── ReceiveBuffer.cs │ ├── ReceivePacketInfo.cs │ └── temp_Receiver.cs ├── NetworkTrafficData.cs ├── PacketHandler │ ├── BaseHandler.cs │ ├── NotifyRoomChat.cs │ ├── NotifyRoomLeaveUser.cs │ ├── NotifyRoomNewUser.cs │ ├── NotifyRoomUserList.cs │ ├── ResponseLogin.cs │ ├── ResponseRoomEnter.cs │ └── ResponseRoomLeave.cs ├── Program.cs ├── Properties │ └── launchSettings.json ├── TestConfig.cs ├── TestConfigPrint.cs └── TestRunner.cs ├── cpp_vc_unittest ├── README.md ├── [C++ Korea 4th Seminar]Visual Cpp에서 유닛 테스트 하기.pdf ├── [C++ Korea 4th Seminar]Visual Cpp에서 유닛 테스트 하기.pptx └── 유닛테스트 참고 코드 │ ├── NativeLib │ ├── Calculator.cpp │ ├── Calculator.h │ ├── NativeLib.sln │ ├── NativeLib.vcxproj │ ├── NativeLib.vcxproj.filters │ └── ReadMe.txt │ └── UnitTest1 │ ├── UnitTest1.sln │ ├── UnitTest1.vcxproj │ ├── UnitTest1.vcxproj.filters │ ├── stdafx.cpp │ ├── stdafx.h │ ├── targetver.h │ └── unittest1.cpp ├── csharp_omok_client ├── CSharp_OmokClient_0 │ ├── LICENSE │ ├── OmokClient_CSharp │ │ ├── AIPlayer.cs │ │ ├── CSCommon │ │ │ ├── CSErrorCode.cs │ │ │ ├── FastBinaryRead.cs │ │ │ ├── FastBinaryWrite.cs │ │ │ ├── OmokRule.cs │ │ │ ├── PacketDatas.cs │ │ │ ├── PacketHeader.cs │ │ │ └── PacketID.cs │ │ ├── ClientSimpleTcp.cs │ │ ├── DevLog.cs │ │ ├── MainForm.Designer.cs │ │ ├── MainForm.cs │ │ ├── MainForm.resx │ │ ├── MainFormLogic.cs │ │ ├── OmokBoard.cs │ │ ├── OmokClient.csproj │ │ ├── OmokClient.sln │ │ ├── PacketBufferManager.cs │ │ ├── PacketProcessForm.cs │ │ ├── Program.cs │ │ └── sound │ │ │ ├── 대국승리.wav │ │ │ ├── 대국시작.wav │ │ │ ├── 대국종료.wav │ │ │ ├── 무르기.wav │ │ │ ├── 바둑돌소리.wav │ │ │ └── 오류.wav │ ├── README.md │ └── images │ │ └── 001.png ├── CSharp_OmokClient_1 │ ├── AIPlayer.cs │ ├── App.config │ ├── CSCommon │ │ ├── CSErrorCode.cs │ │ ├── FastBinaryRead.cs │ │ ├── FastBinaryWrite.cs │ │ ├── OmokRule.cs │ │ ├── PacketDatas.cs │ │ ├── PacketHeader.cs │ │ └── PacketID.cs │ ├── CSErrorCode.cs │ ├── ClientSimpleTcp.cs │ ├── DevLog.cs │ ├── FastBinaryRead.cs │ ├── FastBinaryWrite.cs │ ├── OmokBoard.cs │ ├── OmokClient.csproj │ ├── OmokClient.sln │ ├── OmokRule.cs │ ├── PacketBufferManager.cs │ ├── PacketDatas.cs │ ├── PacketHeader.cs │ ├── PacketID.cs │ ├── PacketProcessForm.cs │ ├── Program.cs │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── mainForm.Designer.cs │ ├── mainForm.cs │ ├── mainForm.resx │ └── sound │ │ ├── 대국승리.wav │ │ ├── 대국시작.wav │ │ ├── 대국종료.wav │ │ ├── 무르기.wav │ │ ├── 바둑돌소리.wav │ │ └── 오류.wav ├── CSharp_OmokClient_2 │ ├── AIPlayer.cs │ ├── App.config │ ├── CSCommon │ │ ├── CSErrorCode.cs │ │ ├── FastBinaryRead.cs │ │ ├── FastBinaryWrite.cs │ │ ├── OmokRule.cs │ │ ├── PacketDatas.cs │ │ ├── PacketHeader.cs │ │ └── PacketID.cs │ ├── CSErrorCode.cs │ ├── ClientSimpleTcp.cs │ ├── DevLog.cs │ ├── FastBinaryRead.cs │ ├── FastBinaryWrite.cs │ ├── OmokBoard.cs │ ├── OmokClient.csproj │ ├── OmokClient.sln │ ├── OmokRule.cs │ ├── PacketBufferManager.cs │ ├── PacketDatas.cs │ ├── PacketHeader.cs │ ├── PacketID.cs │ ├── PacketProcessForm.cs │ ├── Program.cs │ ├── Properties │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── mainForm.Designer.cs │ ├── mainForm.cs │ ├── mainForm.resx │ └── sound │ │ ├── 대국승리.wav │ │ ├── 대국시작.wav │ │ ├── 대국종료.wav │ │ ├── 무르기.wav │ │ ├── 바둑돌소리.wav │ │ └── 오류.wav ├── CSharp_OmokClient_3 │ ├── AIPlayer.cs │ ├── App.config │ ├── CSCommon │ │ ├── AIPlayer.cs │ │ ├── CSErrorCode.cs │ │ ├── FastBinaryRead.cs │ │ ├── FastBinaryWrite.cs │ │ ├── OmokRule.cs │ │ ├── PacketDatas.cs │ │ ├── PacketHeader.cs │ │ └── PacketID.cs │ ├── ClientSimpleTcp.cs │ ├── DevLog.cs │ ├── OmokBoard.cs │ ├── OmokClient.csproj │ ├── OmokClient.sln │ ├── PacketBufferManager.cs │ ├── PacketProcessForm.cs │ ├── Program.cs │ ├── Properties │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── mainForm.Designer.cs │ ├── mainForm.cs │ ├── mainForm.resx │ └── sound │ │ ├── 대국승리.wav │ │ ├── 대국시작.wav │ │ ├── 대국종료.wav │ │ ├── 무르기.wav │ │ ├── 바둑돌소리.wav │ │ └── 오류.wav ├── README.md └── images │ └── 001.png ├── db_sharding_explained.png ├── docker └── docker-202301_ksy │ ├── .gitignore │ ├── APIServer │ ├── Dockerfile │ ├── Program.cs │ └── README.md │ ├── DB │ ├── Dockerfile │ └── Dump.sql │ ├── FakeHiveServer │ ├── Dockerfile │ ├── Program.cs │ └── README.md │ ├── README.md │ └── docker-compose.yml ├── docs ├── 게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍 │ ├── Chapter01.md │ ├── Chapter02.md │ ├── Chapter03.md │ ├── Chapter04.md │ ├── Chapter05.md │ ├── Chapter06.md │ ├── Chapter07.md │ ├── README.md │ ├── codes │ │ ├── tcp_MixedLengthClient │ │ │ ├── Defines.h │ │ │ ├── MixedLengthClient.h │ │ │ ├── MixedLengthClient.sln │ │ │ ├── MixedLengthClient.vcxproj │ │ │ └── main.cpp │ │ ├── tcp_MixedLengthServer │ │ │ ├── Defines.h │ │ │ ├── MixedLengthServer.h │ │ │ ├── MixedLengthServer.sln │ │ │ ├── MixedLengthServer.vcxproj │ │ │ └── main.cpp │ │ ├── tcp_client_01 │ │ │ ├── main.cpp │ │ │ ├── tcp_client_01.sln │ │ │ └── tcp_client_01.vcxproj │ │ ├── tcp_client_02 │ │ │ ├── main.cpp │ │ │ ├── tcp_client_02.sln │ │ │ └── tcp_client_02.vcxproj │ │ ├── tcp_client_03 │ │ │ ├── main.cpp │ │ │ ├── tcp_client_03.sln │ │ │ └── tcp_client_03.vcxproj │ │ ├── tcp_server_01 │ │ │ ├── main.cpp │ │ │ ├── tcp_server_01.sln │ │ │ └── tcp_server_01.vcxproj │ │ ├── tcp_server_02 │ │ │ ├── main.cpp │ │ │ ├── tcp_server_02.sln │ │ │ └── tcp_server_02.vcxproj │ │ └── tcp_server_03 │ │ │ ├── main.cpp │ │ │ ├── tcp_server_03.sln │ │ │ └── tcp_server_03.vcxproj │ └── images │ │ ├── 002.png │ │ ├── 003.png │ │ ├── 004.png │ │ ├── 005.png │ │ ├── 006.png │ │ ├── 007.png │ │ ├── 008.png │ │ ├── 009.png │ │ ├── 010.png │ │ ├── 011.png │ │ ├── 012.png │ │ ├── 013.png │ │ ├── 014.png │ │ ├── 015.png │ │ ├── 016.png │ │ ├── 017.png │ │ ├── 018.png │ │ ├── 019.png │ │ ├── 020.png │ │ ├── 021.png │ │ ├── 022.png │ │ ├── 023.png │ │ ├── 024.png │ │ ├── 025.png │ │ ├── 026.png │ │ ├── 027.png │ │ ├── 028.png │ │ ├── 029.png │ │ ├── 030.png │ │ ├── 031.png │ │ ├── 032.png │ │ ├── 033.png │ │ ├── 034.png │ │ ├── 035.png │ │ ├── 036.png │ │ ├── 037.png │ │ ├── 038.png │ │ ├── 039.png │ │ ├── 040.png │ │ ├── 041.png │ │ ├── 042.png │ │ ├── 043.png │ │ ├── 044.png │ │ ├── 045.png │ │ ├── 046.png │ │ ├── 047.png │ │ ├── 048.png │ │ ├── 049.png │ │ ├── 050.png │ │ ├── 051.png │ │ ├── 052.png │ │ ├── 053.png │ │ ├── 054.png │ │ ├── 055.png │ │ ├── 056.png │ │ ├── 057.png │ │ ├── 058.png │ │ ├── 059.png │ │ ├── 201.png │ │ ├── 202.png │ │ ├── 203.png │ │ ├── 204.png │ │ ├── 205.png │ │ ├── 206.png │ │ ├── 207.png │ │ ├── 208.png │ │ └── 209.png └── 게임_서버_개발자_알아야할_네트워크_이론 │ ├── README.md │ └── images │ ├── 001.png │ ├── 002.png │ ├── 003.png │ ├── 004.png │ ├── 005.png │ ├── 006.png │ ├── 007.png │ ├── 008.png │ ├── 009.png │ ├── 010.png │ ├── 011.png │ └── 012.png ├── hands-on ├── CodeGeneratorStringParsePacket │ ├── GeneratorCodeUnitTest │ │ ├── CppUnitTest │ │ │ ├── CppUnitTest.sln │ │ │ ├── CppUnitTest.vcxproj │ │ │ ├── CppUnitTest.vcxproj.filters │ │ │ ├── SampleEnDecoder.h │ │ │ ├── UnitTest_EnDecode.cpp │ │ │ ├── stdafx.cpp │ │ │ ├── stdafx.h │ │ │ └── targetver.h │ │ └── UnitTestProject │ │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ │ ├── SamplePacket.cs │ │ │ ├── SamplePacketEnDecode.cs │ │ │ ├── UnitSamplePacket.cs │ │ │ └── UnitTestProject.csproj │ ├── PacketBinaryEnCodingGenerator │ │ ├── CSharpPacketProtocolFileParse.cs │ │ ├── CheckDataType.cs │ │ ├── CodeGenerator.cs │ │ ├── CppPacketProtocolFileParse.cs │ │ ├── GenerateCSharpEnDecoder.cs │ │ ├── GenerateCSharpPacketProtocolFile.cs │ │ ├── GenerateCppEnDecoder.cs │ │ ├── PacketBinaryEnCodingGenerator.csproj │ │ ├── PacketBinaryEnCodingGenerator.sln │ │ └── Templete │ │ │ ├── CSharpEnDecoderTemplete.txt │ │ │ └── CppEnDecoderTemplete.txt │ ├── README.md │ ├── SampleProtocol.cs │ ├── SampleProtocol.h │ └── Samples │ │ ├── ConsoleApp │ │ ├── ConsoleApp.csproj │ │ ├── ConsoleApp.sln │ │ └── Program.cs │ │ ├── TestApp │ │ ├── App.config │ │ ├── MainForm.Designer.cs │ │ ├── MainForm.cs │ │ ├── MainForm.resx │ │ ├── Program.cs │ │ ├── Properties │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Resources.Designer.cs │ │ │ ├── Resources.resx │ │ │ ├── Settings.Designer.cs │ │ │ └── Settings.settings │ │ ├── TestApp.csproj │ │ └── TestApp.sln │ │ └── WinFormApp │ │ ├── App.config │ │ ├── GuiApp.csproj │ │ ├── GuiApp.sln │ │ ├── MainForm.Designer.cs │ │ ├── MainForm.cs │ │ ├── MainForm.resx │ │ ├── Program.cs │ │ └── Properties │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings └── README.md ├── linux_basic_cmd.md └── monogame ├── Project1 ├── .config │ └── dotnet-tools.json ├── Content │ └── Content.mgcb ├── Game1.cs ├── Icon.ico ├── Program.cs ├── Project1.csproj ├── Project1.sln └── app.manifest └── monogame.md /auto_test/.gitignore: -------------------------------------------------------------------------------- 1 | 00_bins 2 | _* -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ActionTimeChecker.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient 2 | { 3 | public class ActionTimeChecker 4 | { 5 | public Action CheckingAction; 6 | 7 | private bool _isRunning = false; 8 | private Thread _updater; 9 | private int _updateIntervalMilliSec; 10 | 11 | public void Init(int updateIntervalMilliSec) 12 | { 13 | _updateIntervalMilliSec = updateIntervalMilliSec; 14 | _updater = new Thread(Work); 15 | } 16 | 17 | public void Start() 18 | { 19 | _isRunning = true; 20 | _updater.Start(); 21 | } 22 | 23 | public void Stop() 24 | { 25 | _isRunning = false; 26 | _updater.Join(); 27 | } 28 | 29 | private void Work() 30 | { 31 | while (_isRunning == true) 32 | { 33 | CheckingAction(); 34 | 35 | Thread.Sleep(_updateIntervalMilliSec); 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/AutoTestClient.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33530.505 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoTestClient", "AutoTestClient.csproj", "{090652B5-F14D-458E-A28D-25DFE8EEE262}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CSCommon", "..\CSCommon\CSCommon.csproj", "{9560B1B1-1168-4F1E-A09F-2915DB676976}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {9560B1B1-1168-4F1E-A09F-2915DB676976}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {9560B1B1-1168-4F1E-A09F-2915DB676976}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {9560B1B1-1168-4F1E-A09F-2915DB676976}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {9560B1B1-1168-4F1E-A09F-2915DB676976}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {6A430F5C-49BA-4895-8A19-6A540BF9AB7C} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Dummy/DummyBase.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Dummy 2 | { 3 | public class DummyBase 4 | { 5 | public Int32 Index { get; protected set; } = -1; 6 | 7 | public Int32 Number { get; protected set; } = -1; 8 | 9 | public string ID { get; protected set; } = string.Empty; 10 | 11 | public DummnyState CurrnetState { get; protected set; } = DummnyState.None; 12 | } 13 | 14 | public enum DummnyState 15 | { 16 | None = 0, 17 | Connected = 1, 18 | Login = 2, 19 | Room = 3, 20 | Game = 4, 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Dummy/DummyObject.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Dummy 2 | { 3 | public class DummyObject : DummyAction 4 | { 5 | public void Init(Int32 index, Int32 number, ScenarioRunnerConfig config) 6 | { 7 | Index = index; 8 | Number = number; 9 | ID = $"DUMMY_{number}"; 10 | 11 | if (config.IsRoomScenario() == true) 12 | { 13 | OtherUserIDList = new(config.RoomUserMaxCount.Value); 14 | } 15 | 16 | InitNetworkConfig(config); 17 | InitActionConfig(config); 18 | InitGameConfig(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Dummy/DummyRoom.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Dummy 2 | { 3 | public class DummyRoom : DummyNetwork 4 | { 5 | public Int32 EnteredRoomNumber { get; protected set; } = -1; 6 | 7 | public List OtherUserIDList { get; protected set; } 8 | 9 | public string SendedChatMessage { get; protected set; } = string.Empty; 10 | 11 | public ErrorCode AddOtherUserID(string otherUserID) 12 | { 13 | if (OtherUserIDList.Contains(otherUserID) == true) 14 | { 15 | return ErrorCode.AlreadyRoomUserID; 16 | } 17 | 18 | if (OtherUserIDList.Count == OtherUserIDList.Capacity) 19 | { 20 | return ErrorCode.FailedRoomEnterIsFullRoom; 21 | } 22 | 23 | OtherUserIDList.Add(otherUserID); 24 | 25 | return ErrorCode.None; 26 | } 27 | 28 | public bool RemoveOtherUserID(string otherUserID) 29 | { 30 | return OtherUserIDList.Remove(otherUserID); 31 | } 32 | 33 | protected void ReadyRoomChatAction() 34 | { 35 | SendedChatMessage = $"TEST_CHAT_MESSAGE_{Number}"; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ErrorCode.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient 2 | { 3 | // 20000 ~ 24999 4 | public enum ErrorCode : Int16 5 | { 6 | None = 0, 7 | 8 | // Configs (20001 ~ 20500) 9 | InvalidScenario = 20001, 10 | InvalidScenarioRunTimeSec, 11 | InvalidScenarioRepeatCount, 12 | InvalidDummyCount, 13 | InvalidDummyStartNumber, 14 | InvalidDummyActionTimeoutSec, 15 | InvalidDummyActionIntervalMilliSec, 16 | InvalidRemoteEndPoint, 17 | InvalidRoomCount, 18 | InvalidRoomStartNumber, 19 | InvalidRoomUserMaxCount, 20 | 21 | // Room (20801 ~ 20900) 22 | FailedRoomEnterIsFullRoom = 20801, 23 | FailedRoomEnterInvalidRoomNumber, 24 | FailedRoomLeaveInvalidRoomNumber, 25 | FailedRoomLeaveInvaildUserNumber, 26 | 27 | // RoomNumberAllocator (20901 ~ 20950) 28 | FailedRoomNumberAlloc = 20901, 29 | FailedRoomNumberReleaseInvaildRoomNumber, 30 | FailedRoomNumberReleaseRangeOver, 31 | 32 | // Socket (21001 ~ 21500) 33 | FailedConnect = 21001, 34 | FailedConnectTimeout, 35 | FailedDisconnect, 36 | FailedSend, 37 | FailedReceive, 38 | FailedReceivePacketTimeout, 39 | FailedReceiveRangeOverPacketSize, 40 | FailedReceivePacketException, 41 | FailedReceivePacketRecvBufferEmpty, 42 | FailedReceivePacketNotConnectedDummy, 43 | 44 | // etc 45 | FailedRequestProcess = 21501, 46 | SkipPacket = 21502, 47 | 48 | NotMatchOpponentID, 49 | NotMatchStoneType, 50 | NotMatchTurn, 51 | NotMatchGameResult, 52 | RangeOverOmokBoardX, 53 | RangeOverOmokBoardY, 54 | DuplicationX, 55 | DuplicationY, 56 | 57 | 58 | NotProccessingResponse, 59 | AlreadyRoomUserID, 60 | FailedOpenConfigFile = 24997, 61 | NotStartedAction = 24998, 62 | End = 24999, 63 | } 64 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/ReceivePacketInfo.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Network 2 | { 3 | public class ReceivePacketInfo 4 | { 5 | public Int32 DummyIndex { get; set; } 6 | 7 | public byte[] Packet { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/Receiver.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Network 2 | { 3 | public class Receiver 4 | { 5 | public Action ReceiveAction; 6 | 7 | private bool _isRunning = false; 8 | private Thread _updater; 9 | private Int32 _updateIntervalMilliSec; 10 | 11 | public void Init(Int32 updateIntervalMilliSec) 12 | { 13 | _updateIntervalMilliSec = updateIntervalMilliSec; 14 | _updater = new Thread(Work); 15 | } 16 | 17 | public void Start() 18 | { 19 | _isRunning = true; 20 | _updater.Start(); 21 | } 22 | 23 | public void Stop() 24 | { 25 | _isRunning = false; 26 | _updater.Join(); 27 | } 28 | 29 | private void Work() 30 | { 31 | while (_isRunning == true) 32 | { 33 | ReceiveAction(); 34 | 35 | Thread.Sleep(_updateIntervalMilliSec); 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/BaseHandler.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | namespace AutoTestClient.Network.S2CPacketHandler 4 | { 5 | public abstract class BaseHandler 6 | { 7 | public static Func GetDummyByIndexFunc; 8 | 9 | public static Func GetDummyByIDFunc; 10 | 11 | public abstract void Handle(DummyObject dummy, byte[] packet); 12 | } 13 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/NotifyGameStart.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class NotifyGameStart : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | // 응답 확인 14 | var notifyData = MemoryPackSerializer.Deserialize(packet); 15 | 16 | // 동일한 방 유저가 보냈는지 확인 17 | var opponentID = notifyData.OpponentID; 18 | var opponentDummy = GetDummyByIDFunc(opponentID); 19 | if (dummy.EnteredRoomNumber != opponentDummy.EnteredRoomNumber) 20 | { 21 | Monitor.IncreaseFailedActionCount(); 22 | 23 | Console.WriteLine($"Not match room user (me:{dummy.EnteredRoomNumber}, other:{opponentDummy.EnteredRoomNumber})"); 24 | dummy.ScenarioDone(false, $"Not match room user (me:{dummy.EnteredRoomNumber}, other:{opponentDummy.EnteredRoomNumber})"); 25 | return; 26 | } 27 | 28 | // 게임 정보 세팅 29 | var turn = notifyData.Turn; 30 | var stoneType = (StoneType)notifyData.StoneType; 31 | 32 | dummy.GameStartSuccessAction(turn, stoneType, opponentID); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/NotifyRoomLeaveUser.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | namespace AutoTestClient.Network.S2CPacketHandler 7 | { 8 | public class NotifyRoomLeaveUser : BaseHandler 9 | { 10 | public override void Handle(DummyObject dummy, byte[] packet) 11 | { 12 | // 응답 확인 13 | var notifyData = MemoryPackSerializer.Deserialize(packet); 14 | var leavedUserID = notifyData.UserID; 15 | 16 | // 나간 유저 ID 삭제 (동일한 방 유저가 아니면 함수에 실패한다.) 17 | if (dummy.RemoveOtherUserID(leavedUserID) == false) 18 | { 19 | Console.WriteLine($"Failed remove room user (RemovedUserID: {leavedUserID}"); 20 | dummy.ScenarioDone(false, $"Failed remove room user (RemovedUserID: {leavedUserID}"); 21 | 22 | Monitor.IncreaseFailedActionCount(); 23 | } 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/NotifyRoomNewUser.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class NotifyRoomNewUser : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | // 응답 확인 14 | var notifyData = MemoryPackSerializer.Deserialize(packet); 15 | var enteredUserID = notifyData.UserID; 16 | 17 | // 해당 더미에 새롭게 방에 입장한 유저 ID를 추가한다. 18 | var result = dummy.AddOtherUserID(enteredUserID); 19 | if (result != ErrorCode.None) 20 | { 21 | Console.WriteLine($"Failed added new room user with error: {result}"); 22 | dummy.ScenarioDone(false, $"Failed added new room user with error: {result}"); 23 | 24 | Monitor.IncreaseFailedActionCount(); 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/NotifyRoomUserList.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class NotifyRoomUserList : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | // 응답 확인 14 | var notifyData = MemoryPackSerializer.Deserialize(packet); 15 | var otherUserIDList = notifyData.UserIDList; 16 | 17 | // 방에 입장한 더미는 기존에 방에 존재했던 유저(들)의 ID를 추가한다. 18 | foreach (var otherUserID in otherUserIDList) 19 | { 20 | var result = dummy.AddOtherUserID(otherUserID); 21 | 22 | if (result != ErrorCode.None) 23 | { 24 | Console.WriteLine($"Failed Add other user id with error : {result}"); 25 | dummy.ScenarioDone(false, message: $"Failed Add other user id with error : {result}"); 26 | 27 | Monitor.IncreaseFailedActionCount(); 28 | return; 29 | } 30 | } 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/ResponseGameStart.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class ResponseGameStart : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | var responseData = MemoryPackSerializer.Deserialize(packet); 14 | 15 | // 응답 확인 16 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 17 | if (errorCode != CSCommon.ErrorCode.None) 18 | { 19 | // 아직 다른 유저가 게임 시작을 하지 않았다. 20 | if (errorCode == CSCommon.ErrorCode.NotAllGameReady) 21 | { 22 | // 게임 시작 요청 패킷에 대한 응답은 풀어둔다. 23 | dummy.WakeForResponse(); 24 | return; 25 | } 26 | 27 | // 그게 아니면 에러다. 28 | Console.WriteLine($"Failed GameStart room with error : {errorCode}"); 29 | dummy.ScenarioDone(false, $"Failed GameStart room with error : {errorCode}"); 30 | 31 | Monitor.IncreaseFailedActionCount(); 32 | return; 33 | } 34 | 35 | // 모든 유저가 게임을 시작했다. 36 | 37 | var turn = responseData.Turn; 38 | var stoneType = (StoneType)responseData.StoneType; 39 | var opponentID = responseData.OpponentID; 40 | dummy.GameStartSuccessAction(turn, stoneType, opponentID); 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/ResponseLogin.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class ResponseLogin : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | // 응답 확인 14 | var responseData = MemoryPackSerializer.Deserialize(packet); 15 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 16 | if (errorCode != CSCommon.ErrorCode.None) 17 | { 18 | Console.WriteLine($"Failed login with error : {errorCode}"); 19 | dummy.ScenarioDone(false, $"Failed login with error : {errorCode}"); 20 | 21 | Monitor.IncreaseFailedActionCount(); 22 | return; 23 | } 24 | 25 | dummy.LoginSuccessAction(); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/ResponsePutStone.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class ResponsePutStone : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | var responseData = MemoryPackSerializer.Deserialize(packet); 14 | 15 | // 응답 확인 16 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 17 | if (errorCode != CSCommon.ErrorCode.None) 18 | { 19 | Monitor.IncreaseFailedActionCount(); 20 | dummy.ScenarioDone(false, $"Failed put stone with error : {errorCode}"); 21 | return; 22 | } 23 | 24 | // 돌 놓기 결과 확인 25 | var gameResult = (돌놓기결과)responseData.GameResult; 26 | if (gameResult != 돌놓기결과.None) 27 | { 28 | // 게임이 종료됐다. 29 | if (gameResult == 돌놓기결과.GameDone) 30 | { 31 | var winner = (StoneType)responseData.Winner; 32 | 33 | // 여기서 게임을 끝내고 해당 더미를 깨우면, 다음 루프에서 게임 루프를 빠져나오게 된다. 34 | dummy.GameDone(winner); 35 | dummy.WakeForResponse(); 36 | 37 | Monitor.DecreaseGameDummyCount(); 38 | return; 39 | } 40 | 41 | // 돌이 이미 존재함. 42 | if (gameResult == 돌놓기결과.NotEmpty) 43 | { 44 | Console.WriteLine("중복된 위치에 돌을 놨다."); 45 | dummy.WakeForResponse(); 46 | return; 47 | } 48 | } 49 | 50 | // 돌 놓기만 성공했다면, 턴 변경. 51 | var turn = responseData.Turn; 52 | dummy.PutStoneSuccessAction(turn); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/ResponseRoomEnter.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class ResponseRoomEnter : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | // 응답 확인 14 | var responseData = MemoryPackSerializer.Deserialize(packet); 15 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 16 | if (errorCode != CSCommon.ErrorCode.None) 17 | { 18 | Monitor.IncreaseFailedActionCount(); 19 | 20 | dummy.ScenarioDone(false, $"Failed RoomEnter with error : {errorCode}"); 21 | return; 22 | } 23 | 24 | dummy.RoomEnterSuccessAction(); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Network/S2CPacketHandler/ResponseRoomLeave.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using CSCommon; 4 | 5 | using MemoryPack; 6 | 7 | namespace AutoTestClient.Network.S2CPacketHandler 8 | { 9 | public class ResponseRoomLeave : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | // 응답 확인 14 | var responseData = MemoryPackSerializer.Deserialize(packet); 15 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 16 | if (errorCode != CSCommon.ErrorCode.None) 17 | { 18 | Monitor.IncreaseFailedActionCount(); 19 | 20 | dummy.ScenarioDone(false, $"Failed RoomLeave with error : {errorCode}"); 21 | return; 22 | } 23 | 24 | dummy.RoomLeaveSuccessAction(); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/OmokBoard.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient 2 | { 3 | public class OmokBoard 4 | { 5 | public int Height { get; private set; } 6 | 7 | public int Width { get; private set; } 8 | 9 | private StoneType[,] _board; 10 | 11 | public int Size() => _board.Length; 12 | 13 | public void Init(int width, int height) 14 | { 15 | Width = width; 16 | Height = height; 17 | 18 | _board = new StoneType[Height, Width]; 19 | } 20 | 21 | public void Prepare() 22 | { 23 | Clear(); 24 | } 25 | 26 | public void Clear() 27 | { 28 | for (int y = 0; y < Height; y++) 29 | { 30 | for (int x = 0; x < Width; x++) 31 | { 32 | _board[y, x] = StoneType.Empty; 33 | } 34 | } 35 | } 36 | 37 | public List<(int Y, int X)> GetEmptyPosition() 38 | { 39 | var results = new List<(int, int)>(); 40 | 41 | for (int y = 0; y < Height; y++) 42 | { 43 | for (int x = 0; x < Width; x++) 44 | { 45 | if (_board[y, x] == StoneType.Empty) 46 | { 47 | results.Add((y, x)); 48 | } 49 | } 50 | } 51 | 52 | return results; 53 | } 54 | 55 | public void 돌놓기(StoneType stoneType, int x, int y) 56 | { 57 | _board[y, x] = stoneType; 58 | } 59 | } 60 | 61 | public enum StoneType : byte 62 | { 63 | Empty = 0, 64 | White = 1, 65 | Black = 2, 66 | } 67 | 68 | public enum 돌놓기결과 : short 69 | { 70 | None = 0, 71 | NotEmpty, 72 | GameDone, 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Text.Json; 2 | 3 | namespace AutoTestClient 4 | { 5 | public class Program 6 | { 7 | private static void Main(string[] args) 8 | { 9 | var configs = LoadConfig(args[0]); 10 | if (configs is null) 11 | { 12 | Console.WriteLine($"Failed load a config file"); 13 | return; 14 | } 15 | 16 | var errorCode = configs.Verify(); 17 | if (errorCode != ErrorCode.None) 18 | { 19 | Console.WriteLine($"Failed verify config with error : {errorCode}"); 20 | return; 21 | } 22 | 23 | var runner = new ScenarioRunner(); 24 | runner.Init(configs); 25 | runner.Run(); 26 | } 27 | 28 | private static ScenarioRunnerConfig LoadConfig(string fileName) 29 | { 30 | var path = Directory.GetCurrentDirectory() + $"\\ScenarioConfigFile\\{fileName}.json"; 31 | 32 | try 33 | { 34 | using (StreamReader file = File.OpenText(path)) 35 | { 36 | var nakedData = file.ReadToEnd(); 37 | ScenarioRunnerConfig configs = JsonSerializer.Deserialize(nakedData); 38 | 39 | return configs; 40 | } 41 | } 42 | catch (Exception e) 43 | { 44 | Console.WriteLine(e.Message); 45 | return null; 46 | } 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "DummyTester": { 4 | "commandName": "Project", 5 | "commandLineArgs": "OnlyConnect\r\nRepeatConnect\r\nRepeatLoginOut\r\nRepeatRoomEnterLeave \r\nRepeatRoomEnterChat\r\nOnlyPlayGame" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/RoomNumberAllocator.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Concurrent; 2 | 3 | namespace AutoTestClient 4 | { 5 | public class RoomNumberAllocator 6 | { 7 | private ConcurrentQueue _numbers = new(); 8 | 9 | public void Init(ScenarioRunnerConfig config) 10 | { 11 | var count = config.RoomCount.Value; 12 | var startNumber = config.RoomStartNumber.Value; 13 | for (Int32 i = 0; i < count; i++) 14 | { 15 | for (Int32 j = 0; j < config.RoomUserMaxCount.Value; j++) 16 | { 17 | _numbers.Enqueue(startNumber + i); 18 | } 19 | } 20 | } 21 | 22 | public Int32 Alloc() 23 | { 24 | Int32 roomNumber; 25 | 26 | if (_numbers.TryDequeue(out roomNumber) == false) 27 | { 28 | return -1; 29 | } 30 | 31 | return roomNumber; 32 | } 33 | 34 | public void Release(Int32 roomNumber) => _numbers.Enqueue(roomNumber); 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Scenario/OnlyConnect.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Scenario 2 | { 3 | public class OnlyConnect : ScenarioBase 4 | { 5 | public override async Task Action(AutoTestClient.Dummy.DummyObject dummy) 6 | { 7 | dummy.ScenarioPrepare(ScenarioType.OnlyConnect); 8 | 9 | while (IsPossbleNextAction(dummy) == true) 10 | { 11 | var result = await dummy.ConnectAction(); 12 | 13 | if (result != ErrorCode.None) 14 | { 15 | dummy.ScenarioDone(false, $"Failed action(OnlyConnect) with error : {result}"); 16 | return; 17 | } 18 | 19 | dummy.SuccessScenarioAction(); 20 | 21 | Monitor.IncreaseScenarioRepeacCount(); 22 | Monitor.IncreaseScenarioRepeacCountPerSeconds(); 23 | } 24 | 25 | dummy.ScenarioDone(true, "Success OnlyConnect"); 26 | } 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Scenario/RepeatConnect.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | namespace AutoTestClient.Scenario 4 | { 5 | public class RepeatConnect : ScenarioBase 6 | { 7 | public override async Task Action(DummyObject dummy) 8 | { 9 | dummy.ScenarioPrepare(ScenarioType.RepeatConnect); 10 | 11 | while (IsPossbleNextAction(dummy) == true) 12 | { 13 | var result = await ConnectDisconnect(dummy); 14 | 15 | if (result != ErrorCode.None) 16 | { 17 | dummy.ScenarioDone(false, $"Failed action(RepeatConnect) with error : {result}"); 18 | return; 19 | } 20 | 21 | dummy.SuccessScenarioAction(); 22 | 23 | Monitor.IncreaseScenarioRepeacCount(); 24 | Monitor.IncreaseScenarioRepeacCountPerSeconds(); 25 | } 26 | 27 | dummy.ScenarioDone(true, "Success RepeatConnect"); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Scenario/RepeatLogin.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Scenario 2 | { 3 | public class RepeatLogin : ScenarioBase 4 | { 5 | public override async Task Action(AutoTestClient.Dummy.DummyObject dummy) 6 | { 7 | dummy.ScenarioPrepare(ScenarioType.RepeatLogin); 8 | 9 | while (IsPossbleNextAction(dummy) == true) 10 | { 11 | var result = await ConnectLoginDisconnect(dummy); 12 | 13 | if (result != ErrorCode.None) 14 | { 15 | dummy.ScenarioDone(false, $"Failed action(RepeatLogin) with error : {result}"); 16 | return; 17 | } 18 | 19 | dummy.SuccessScenarioAction(); 20 | 21 | Monitor.IncreaseScenarioRepeacCount(); 22 | Monitor.IncreaseScenarioRepeacCountPerSeconds(); 23 | } 24 | 25 | dummy.ScenarioDone(true, "Success RepeatLogin"); 26 | } 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Scenario/RepeatRoomEnterChat.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | namespace AutoTestClient.Scenario 4 | { 5 | public class RepeatRoomEnterChat : ScenarioBase 6 | { 7 | public override async Task Action(DummyObject dummy) 8 | { 9 | dummy.ScenarioPrepare(ScenarioType.RepeatRoomEnterChat); 10 | 11 | // 1. 방 입장 12 | var result1 = await ConnectLoginRoomEnter(dummy); 13 | if (result1 != ErrorCode.None) 14 | { 15 | dummy.ScenarioDone(false, $"Failed action(RepeatRoomEnterLeave) with error : {result1}"); 16 | return; 17 | } 18 | 19 | // 2. 방 채팅 20 | while (IsPossbleNextAction(dummy) == true) 21 | { 22 | var result2 = await dummy.RoomChatRequestAction(); 23 | 24 | if (result2 != ErrorCode.None) 25 | { 26 | dummy.ScenarioDone(false, $"Failed action(RepeatRoomEnterChat) with error : {result2}"); 27 | return; 28 | } 29 | 30 | dummy.SuccessScenarioAction(); 31 | 32 | Monitor.IncreaseScenarioRepeacCount(); 33 | Monitor.IncreaseScenarioRepeacCountPerSeconds(); 34 | } 35 | 36 | dummy.ScenarioDone(true, $"Success RepeatRoomEnterChat"); 37 | } 38 | } 39 | } 40 | 41 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/Scenario/RepeatRoomEnterLeave.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Scenario 2 | { 3 | public class RepeatRoomEnterLeave : ScenarioBase 4 | { 5 | public override async Task Action(AutoTestClient.Dummy.DummyObject dummy) 6 | { 7 | dummy.ScenarioPrepare(ScenarioType.RepeatRoomEnterLeave); 8 | 9 | // 1. 로그인 10 | var result1 = await ConnectLogin(dummy); 11 | if (result1 != ErrorCode.None) 12 | { 13 | dummy.ScenarioDone(false, $"Failed action(RepeatRoomEnterLeave) with error : {result1}"); 14 | return; 15 | } 16 | 17 | // 2. 방 입장 -> 방 퇴장 18 | while (IsPossbleNextAction(dummy) == true) 19 | { 20 | var result2 = await RoomEnterLeave(dummy); 21 | 22 | if (result2 != ErrorCode.None) 23 | { 24 | dummy.ScenarioDone(false, $"Failed action(RepeatRoomEnterLeave) with error : {result2}"); 25 | return; 26 | } 27 | 28 | dummy.SuccessScenarioAction(); 29 | 30 | Monitor.IncreaseScenarioRepeacCount(); 31 | Monitor.IncreaseScenarioRepeacCountPerSeconds(); 32 | } 33 | 34 | dummy.ScenarioDone(true, $"Success RepeatRoomEnterLeave"); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioConfigFile/OnlyConnect.json: -------------------------------------------------------------------------------- 1 | { 2 | "Scenario": { 3 | "Value": 1, 4 | "Comment": "테스트 할 시나리오 번호" 5 | }, 6 | "ScenarioRepeatCount": { 7 | "Value": 1, 8 | "Comment": "시나리오 반복 횟수 (값이 0이면 시나리오 진행 시간에 의해서만 테스트가 종료된다.)" 9 | }, 10 | "ScenarioRunTimeSec": { 11 | "Value": 0, 12 | "Comment": "시나리오 진행 시간 (값이 0이면 시나리오 반복 횟수 도달에 의해서만 테스트가 종료된다.)" 13 | }, 14 | "DummyCount": { 15 | "Value": 3000, 16 | "Comment": "더미 생성 개수" 17 | }, 18 | "DummyStartNumber": { 19 | "Value": 0, 20 | "Comment": "더미 번호 부여 시 사용할 시작 번호" 21 | }, 22 | "DummyActionTimeoutSec": { 23 | "Value": 5, 24 | "Comment": "더미 시나리오 액션 타임 아웃 시간" 25 | }, 26 | "DummyActionIntervalMilliSec": { 27 | "Value": 32, 28 | "Comment": "더미 시나리오 액션 별 실행 간격 (ms)" 29 | }, 30 | "RemoteEndPoint": { 31 | "Value": "127.0.0.1:11023", 32 | "Comment": "더미가 연결할 서버 접속 정보" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioConfigFile/OnlyPlayGame.json: -------------------------------------------------------------------------------- 1 | { 2 | "Scenario": { 3 | "Value": 6, 4 | "Comment": "테스트 할 시나리오 번호" 5 | }, 6 | "ScenarioRepeatCount": { 7 | "Value": 10, 8 | "Comment": "시나리오 반복 횟수 (값이 0이면 시나리오 진행 시간에 의해서만 테스트가 종료된다.)" 9 | }, 10 | "ScenarioRunTimeSec": { 11 | "Value": 0, 12 | "Comment": "시나리오 진행 시간 (값이 0이면 시나리오 반복 횟수 도달에 의해서만 테스트가 종료된다.)" 13 | }, 14 | "DummyCount": { 15 | "Value": 3000, 16 | "Comment": "더미 생성 개수" 17 | }, 18 | "DummyStartNumber": { 19 | "Value": 0, 20 | "Comment": "더미 번호 부여 시 사용할 시작 번호" 21 | }, 22 | "DummyActionTimeoutSec": { 23 | "Value": 30, 24 | "Comment": "더미 시나리오 액션 타임 아웃 시간" 25 | }, 26 | "DummyActionIntervalMilliSec": { 27 | "Value": 30, 28 | "Comment": "더미 시나리오 액션 별 실행 간격 (ms)" 29 | }, 30 | "RemoteEndPoint": { 31 | "Value": "127.0.0.1:11024", 32 | "Comment": "더미가 연결할 서버 접속 정보" 33 | }, 34 | "RoomCount": { 35 | "Value": 1500, 36 | "Comment": "생성할 방 개수" 37 | }, 38 | "RoomStartNumber": { 39 | "Value": 0, 40 | "Comment": "방 번호 부여 시 사용할 시작 번호" 41 | }, 42 | "RoomUserMaxCount": { 43 | "Value": 2, 44 | "Comment": "방 수용 가능 인원" 45 | } 46 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioConfigFile/RepeatConnect.json: -------------------------------------------------------------------------------- 1 | { 2 | "Scenario": { 3 | "Value": 2, 4 | "Comment": "테스트 할 시나리오 번호" 5 | }, 6 | "ScenarioRepeatCount": { 7 | "Value": 0, 8 | "Comment": "시나리오 반복 횟수 (값이 0이면 시나리오 진행 시간에 의해서만 테스트가 종료된다.)" 9 | }, 10 | "ScenarioRunTimeSec": { 11 | "Value": 10, 12 | "Comment": "시나리오 진행 시간 (값이 0이면 시나리오 반복 횟수 도달에 의해서만 테스트가 종료된다.)" 13 | }, 14 | "DummyCount": { 15 | "Value": 3000, 16 | "Comment": "더미 생성 개수" 17 | }, 18 | "DummyStartNumber": { 19 | "Value": 0, 20 | "Comment": "더미 번호 부여 시 사용할 시작 번호" 21 | }, 22 | "DummyActionTimeoutSec": { 23 | "Value": 5, 24 | "Comment": "더미 시나리오 액션 타임 아웃 시간" 25 | }, 26 | "DummyActionIntervalMilliSec": { 27 | "Value": 50, 28 | "Comment": "더미 시나리오 액션 별 실행 간격 (ms)" 29 | }, 30 | "RemoteEndPoint": { 31 | "Value": "127.0.0.1:11023", 32 | "Comment": "더미가 연결할 서버 접속 정보" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioConfigFile/RepeatLoginOut.json: -------------------------------------------------------------------------------- 1 | { 2 | "Scenario": { 3 | "Value": 3, 4 | "Comment": "테스트 할 시나리오 번호" 5 | }, 6 | "ScenarioRepeatCount": { 7 | "Value": 0, 8 | "Comment": "시나리오 반복 횟수 (값이 0이면 시나리오 진행 시간에 의해서만 테스트가 종료된다.)" 9 | }, 10 | "ScenarioRunTimeSec": { 11 | "Value": 60, 12 | "Comment": "시나리오 진행 시간 (값이 0이면 시나리오 반복 횟수 도달에 의해서만 테스트가 종료된다.)" 13 | }, 14 | "DummyCount": { 15 | "Value": 3000, 16 | "Comment": "더미 생성 개수" 17 | }, 18 | "DummyStartNumber": { 19 | "Value": 0, 20 | "Comment": "더미 번호 부여 시 사용할 시작 번호" 21 | }, 22 | "DummyActionTimeoutSec": { 23 | "Value": 50, 24 | "Comment": "더미 시나리오 액션 타임 아웃 시간" 25 | }, 26 | "DummyActionIntervalMilliSec": { 27 | "Value": 50, 28 | "Comment": "더미 시나리오 액션 별 실행 간격 (ms)" 29 | }, 30 | "RemoteEndPoint": { 31 | "Value": "127.0.0.1:11024", 32 | "Comment": "더미가 연결할 서버 접속 정보" 33 | } 34 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioConfigFile/RepeatRoomEnterChat.json: -------------------------------------------------------------------------------- 1 | { 2 | "Scenario": { 3 | "Value": 5, 4 | "Comment": "테스트 할 시나리오 번호" 5 | }, 6 | "ScenarioRepeatCount": { 7 | "Value": 0, 8 | "Comment": "시나리오 반복 횟수 (값이 0이면 시나리오 진행 시간에 의해서만 테스트가 종료된다.)" 9 | }, 10 | "ScenarioRunTimeSec": { 11 | "Value": 60, 12 | "Comment": "시나리오 진행 시간 (값이 0이면 시나리오 반복 횟수 도달에 의해서만 테스트가 종료된다.)" 13 | }, 14 | "DummyCount": { 15 | "Value": 200, 16 | "Comment": "더미 생성 개수" 17 | }, 18 | "DummyStartNumber": { 19 | "Value": 0, 20 | "Comment": "더미 번호 부여 시 사용할 시작 번호" 21 | }, 22 | "DummyActionTimeoutSec": { 23 | "Value": 30, 24 | "Comment": "더미 시나리오 액션 타임 아웃 시간" 25 | }, 26 | "DummyActionIntervalMilliSec": { 27 | "Value": 30, 28 | "Comment": "더미 시나리오 액션 별 실행 간격 (ms)" 29 | }, 30 | "RemoteEndPoint": { 31 | "Value": "127.0.0.1:11023", 32 | "Comment": "더미가 연결할 서버 접속 정보" 33 | }, 34 | "RoomCount": { 35 | "Value": 100, 36 | "Comment": "생성할 방 개수" 37 | }, 38 | "RoomStartNumber": { 39 | "Value": 0, 40 | "Comment": "방 번호 부여 시 사용할 시작 번호" 41 | }, 42 | "RoomUserMaxCount": { 43 | "Value": 2, 44 | "Comment": "방 수용 가능 인원" 45 | } 46 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioConfigFile/RepeatRoomEnterLeave.json: -------------------------------------------------------------------------------- 1 | { 2 | "Scenario": { 3 | "Value": 4, 4 | "Comment": "테스트 할 시나리오 번호" 5 | }, 6 | "ScenarioRepeatCount": { 7 | "Value": 0, 8 | "Comment": "시나리오 반복 횟수 (값이 0이면 시나리오 진행 시간에 의해서만 테스트가 종료된다.)" 9 | }, 10 | "ScenarioRunTimeSec": { 11 | "Value": 60, 12 | "Comment": "시나리오 진행 시간 (값이 0이면 시나리오 반복 횟수 도달에 의해서만 테스트가 종료된다.)" 13 | }, 14 | "DummyCount": { 15 | "Value": 3000, 16 | "Comment": "더미 생성 개수" 17 | }, 18 | "DummyStartNumber": { 19 | "Value": 0, 20 | "Comment": "더미 번호 부여 시 사용할 시작 번호" 21 | }, 22 | "DummyActionTimeoutSec": { 23 | "Value": 30, 24 | "Comment": "더미 시나리오 액션 타임 아웃 시간" 25 | }, 26 | "DummyActionIntervalMilliSec": { 27 | "Value": 30, 28 | "Comment": "더미 시나리오 액션 별 실행 간격 (ms)" 29 | }, 30 | "RemoteEndPoint": { 31 | "Value": "127.0.0.1:11024", 32 | "Comment": "더미가 연결할 서버 접속 정보" 33 | }, 34 | "RoomCount": { 35 | "Value": 1500, 36 | "Comment": "생성할 방 개수" 37 | }, 38 | "RoomStartNumber": { 39 | "Value": 0, 40 | "Comment": "방 번호 부여 시 사용할 시작 번호" 41 | }, 42 | "RoomUserMaxCount": { 43 | "Value": 2, 44 | "Comment": "방 수용 가능 인원" 45 | } 46 | } -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioResult.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient 2 | { 3 | public class ScenarioResult 4 | { 5 | public bool IsSucceeded { get; set; } 6 | 7 | public string Message { get; set; } = string.Empty; 8 | 9 | public Int32 ElapsedTimeMilliSec { get; set; } 10 | 11 | public string LastAction { get; set; } = string.Empty; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /auto_test/AutoDummyClient/ScenarioType.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient 2 | { 3 | public enum ScenarioType 4 | { 5 | NONE = 0, 6 | OnlyConnect = 1, 7 | RepeatConnect = 2, 8 | RepeatLogin = 3, 9 | RepeatRoomEnterLeave = 4, 10 | RepeatRoomEnterChat = 5, 11 | OnlyPlayGame = 6, 12 | END, 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /auto_test/CSCommon/CSCommon.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | 6 | 7 | 8 | true 9 | 10 | 11 | 12 | true 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /auto_test/CSCommon/CSCommon.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30406.217 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSCommon", "CSCommon.csproj", "{9D91EA02-E49A-445A-9B4F-A9611548BC6C}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {3D2AB320-C764-443F-9237-101C3E04A8A4} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /auto_test/CSCommon/ErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace CSCommon 4 | { 5 | // 1000 ~ 19999 6 | public enum ErrorCode : Int16 7 | { 8 | None = 0, 9 | AlreadyLoginState = 1001, 10 | AlreadyRoomEnterState, 11 | InvalidRoomNumber, 12 | NotRoomUser, 13 | FullRoom, 14 | NotAllGameReady, 15 | } 16 | } -------------------------------------------------------------------------------- /auto_test/CSCommon/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace CSCommon 4 | { 5 | // 101 ~ 500 6 | public enum PacketID : Int16 7 | { 8 | BEGIN = 101, 9 | 10 | ReqLogin = 111, 11 | ResLogin = 112, 12 | 13 | ReqRoomEnter = 211, 14 | ResRoomEnter = 212, 15 | NtfRoomNewUser = 213, 16 | NtfRoomUserList = 214, 17 | 18 | ReqRoomLeave = 215, 19 | ResRoomLeave = 216, 20 | NtfRoomLeaveUser = 217, 21 | 22 | ReqRoomChat = 225, 23 | NtfRoomChat = 226, 24 | 25 | ReqGameStart = 311, 26 | ResGameStart = 312, 27 | NtfGameStart = 313, 28 | 29 | ReqPutStone = 321, 30 | ResPutStone = 322, 31 | NtfPutStone = 323, 32 | 33 | InnerConnectedSession = 401, 34 | InnerClosedSession = 402, 35 | 36 | END = 500, 37 | } 38 | } -------------------------------------------------------------------------------- /auto_test/Images/add_scenario/step_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/add_scenario/step_01.png -------------------------------------------------------------------------------- /auto_test/Images/add_scenario/step_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/add_scenario/step_02.png -------------------------------------------------------------------------------- /auto_test/Images/add_scenario/step_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/add_scenario/step_05.png -------------------------------------------------------------------------------- /auto_test/Images/dummy_login_action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/dummy_login_action.png -------------------------------------------------------------------------------- /auto_test/Images/dummy_wait_flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/dummy_wait_flag.png -------------------------------------------------------------------------------- /auto_test/Images/dummy_wake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/dummy_wake.png -------------------------------------------------------------------------------- /auto_test/Images/dummymgr_action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/dummymgr_action.png -------------------------------------------------------------------------------- /auto_test/Images/excute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/excute.png -------------------------------------------------------------------------------- /auto_test/Images/rebuild.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/rebuild.png -------------------------------------------------------------------------------- /auto_test/Images/response_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/response_login.png -------------------------------------------------------------------------------- /auto_test/Images/scenario_base_action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/scenario_base_action.png -------------------------------------------------------------------------------- /auto_test/Images/scenario_base_conn_login_disconn_action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/scenario_base_conn_login_disconn_action.png -------------------------------------------------------------------------------- /auto_test/Images/scenario_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/scenario_config.png -------------------------------------------------------------------------------- /auto_test/Images/scenario_config_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/scenario_config_file.png -------------------------------------------------------------------------------- /auto_test/Images/scenario_runner_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/scenario_runner_mapping.png -------------------------------------------------------------------------------- /auto_test/Images/scenario_switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/scenario_switch.png -------------------------------------------------------------------------------- /auto_test/Images/task_delay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/task_delay.png -------------------------------------------------------------------------------- /auto_test/Images/task_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/task_run.png -------------------------------------------------------------------------------- /auto_test/Images/wake_response_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/auto_test/Images/wake_response_login.png -------------------------------------------------------------------------------- /auto_test2/AutoTestClient.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net9.0 6 | enable 7 | disable 8 | True 9 | ../00_bins/ 10 | 11 | 12 | 13 | False 14 | 15 | 16 | 17 | False 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /auto_test2/AutoTestClient.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33530.505 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoTestClient", "AutoTestClient.csproj", "{090652B5-F14D-458E-A28D-25DFE8EEE262}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {090652B5-F14D-458E-A28D-25DFE8EEE262}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {6A430F5C-49BA-4895-8A19-6A540BF9AB7C} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /auto_test2/CSCommon/CSCommon.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | 6 | 7 | 8 | true 9 | 10 | 11 | 12 | true 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /auto_test2/CSCommon/CSCommon.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30406.217 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSCommon", "CSCommon.csproj", "{9D91EA02-E49A-445A-9B4F-A9611548BC6C}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {9D91EA02-E49A-445A-9B4F-A9611548BC6C}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {3D2AB320-C764-443F-9237-101C3E04A8A4} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /auto_test2/CSCommon/ErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace CSCommon 4 | { 5 | // 1000 ~ 19999 6 | public enum ErrorCode : Int16 7 | { 8 | None = 0, 9 | AlreadyLoginState = 1001, 10 | AlreadyRoomEnterState, 11 | InvalidRoomNumber, 12 | NotRoomUser, 13 | FullRoom, 14 | NotAllGameReady, 15 | } 16 | } -------------------------------------------------------------------------------- /auto_test2/CSCommon/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace CSCommon 4 | { 5 | // 101 ~ 500 6 | public enum PacketID : Int16 7 | { 8 | BEGIN = 101, 9 | 10 | ReqLogin = 111, 11 | ResLogin = 112, 12 | 13 | ReqRoomEnter = 211, 14 | ResRoomEnter = 212, 15 | NtfRoomNewUser = 213, 16 | NtfRoomUserList = 214, 17 | 18 | ReqRoomLeave = 215, 19 | ResRoomLeave = 216, 20 | NtfRoomLeaveUser = 217, 21 | 22 | ReqRoomChat = 225, 23 | NtfRoomChat = 226, 24 | 25 | ReqGameStart = 311, 26 | ResGameStart = 312, 27 | NtfGameStart = 313, 28 | 29 | ReqPutStone = 321, 30 | ResPutStone = 322, 31 | NtfPutStone = 323, 32 | 33 | InnerConnectedSession = 401, 34 | InnerClosedSession = 402, 35 | 36 | END = 500, 37 | } 38 | } -------------------------------------------------------------------------------- /auto_test2/DTasks/DTaskConnect.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using Serilog; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using static System.Collections.Specialized.BitVector32; 9 | 10 | namespace AutoTestClient.DTasks; 11 | 12 | public class DTaskConnect : DTask 13 | { 14 | string _ip; 15 | Int32 _port; 16 | 17 | 18 | public override void Set(RunTimeData runTimeData, DAction action) 19 | { 20 | _runTimeData = runTimeData; 21 | _action = action; 22 | } 23 | 24 | public override async Task Run() 25 | { 26 | Log.Information($"[Connect Try] Dummy: {_runTimeData.DummyNumber}"); 27 | 28 | 29 | var result = new DTaskResult(); 30 | 31 | var errorCode = await _action.Connect(_ip, _port); 32 | if (errorCode != 0) 33 | { 34 | Log.Error($"Connect Error. errorCode:{errorCode}"); 35 | 36 | result.Ret = DTaskResultValue.Failed; 37 | return result; 38 | } 39 | 40 | 41 | result = MakeTaskResultComplete(); 42 | 43 | Log.Information($"[Connect Success] Dummy: {_runTimeData.DummyNumber}"); 44 | return result; 45 | } 46 | 47 | 48 | public override DTask Clone() 49 | { 50 | var task = new DTaskConnect(); 51 | DeepCopy(task); 52 | 53 | return task; 54 | } 55 | 56 | public override void Clear() 57 | { 58 | } 59 | 60 | 61 | public void SetConnectInfo(string ip, Int32 port) 62 | { 63 | _ip = ip; 64 | _port = port; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /auto_test2/DTasks/DTaskDisconnect.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | using Serilog; 4 | 5 | 6 | namespace AutoTestClient.DTasks; 7 | 8 | class DTaskDisconnect : DTask 9 | { 10 | public override void Set(RunTimeData runTimeData, DAction action) 11 | { 12 | _runTimeData = runTimeData; 13 | _action = action; 14 | } 15 | 16 | public override async Task Run() 17 | { 18 | Log.Information($"[DisConnect Try] Dummy: {_runTimeData.DummyNumber}"); 19 | 20 | 21 | var result = new DTaskResult(); 22 | 23 | _action.Disconnect(); 24 | 25 | result = MakeTaskResultComplete(); 26 | 27 | Clear(); 28 | 29 | 30 | Log.Information($"[DisConnect Success] Dummy: {_runTimeData.DummyNumber}"); 31 | await Task.CompletedTask; 32 | return result; 33 | } 34 | 35 | public override DTask Clone() 36 | { 37 | var task = new DTaskDisconnect(); 38 | DeepCopy(task); 39 | 40 | return task; 41 | } 42 | 43 | 44 | public override void Clear() 45 | { 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /auto_test2/DTasks/DTaskResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace AutoTestClient.DTasks; 8 | 9 | public class DTaskResult 10 | { 11 | public DTaskResultValue Ret = DTaskResultValue.None; 12 | public Int32 NextDTaskIndex = 0; 13 | public Int32 NextDTaskWaitTimeMS = 0; 14 | } 15 | 16 | public enum DTaskResultValue 17 | { 18 | None = 0, 19 | Continue = 1, // 진행 중 20 | Completed = 2, // 완료 21 | Failed = 3, // 실패 22 | Terminated = 4, // 종료. 23 | } 24 | -------------------------------------------------------------------------------- /auto_test2/DTasks/DTaskTestEndCheck.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using Serilog; 8 | 9 | using AutoTestClient.Dummy; 10 | 11 | 12 | namespace AutoTestClient.DTasks; 13 | 14 | public class DTaskTestEndCheck : DTask 15 | { 16 | 17 | public override void Set(RunTimeData runTimeData, DAction action) 18 | { 19 | _runTimeData = runTimeData; 20 | _action = action; 21 | 22 | _endTime = DateTime.MaxValue; 23 | } 24 | 25 | public override async Task Run() 26 | { 27 | Log.Information($"[TestEndCheck Try] Dummy: {_runTimeData.DummyNumber}"); 28 | 29 | 30 | var result = new DTaskResult(); 31 | 32 | if (DateTime.Now < _endTime) 33 | { 34 | result = MakeTaskResultComplete(); 35 | return result; 36 | } 37 | 38 | 39 | result.Ret = DTaskResultValue.Terminated; 40 | result.NextDTaskIndex = 0; 41 | 42 | //Log.Debug($"Test End. endTime:{_endTime}"); 43 | await Task.CompletedTask; 44 | Clear(); 45 | 46 | Log.Information($"[TestEndCheck] Dummy: {_runTimeData.DummyNumber}"); 47 | return result; 48 | } 49 | 50 | public override DTask Clone() 51 | { 52 | var task = new DTaskTestEndCheck(); 53 | 54 | DeepCopy(task); 55 | task._endTime = _endTime; 56 | 57 | return task; 58 | } 59 | 60 | 61 | public override void Clear() 62 | { 63 | } 64 | 65 | public void SetEndTime(int endTimeMS) 66 | { 67 | // 현재 시간에 endTimeMS를 더한 시간을 _endTime에 저장한다. 68 | _endTime = DateTime.Now.AddMilliseconds(endTimeMS); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /auto_test2/DTasks/RoomNumberAllocator.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Concurrent; 2 | 3 | namespace AutoTestClient.DTasks; 4 | 5 | 6 | public class RoomNumberAllocator 7 | { 8 | static private ConcurrentQueue _numbers = new(); 9 | 10 | static public void Init(TestConfig config) 11 | { 12 | var count = config.MaxRoomCount; 13 | var startNumber = config.RoomStartNumber; 14 | 15 | for (Int32 i = 0; i < count; i++) 16 | { 17 | for (Int32 j = 0; j < config.RoomUserMaxCount; j++) 18 | { 19 | _numbers.Enqueue(startNumber + i); 20 | } 21 | } 22 | } 23 | 24 | static public Int32 Alloc() 25 | { 26 | if (_numbers.TryDequeue(out var roomNumber)) 27 | { 28 | return roomNumber; 29 | } 30 | 31 | return -1; 32 | } 33 | 34 | static public void Release(Int32 roomNumber) => _numbers.Enqueue(roomNumber); 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /auto_test2/Dummy/DResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace AutoTestClient.Dummy; 8 | 9 | public class DResult 10 | { 11 | } 12 | -------------------------------------------------------------------------------- /auto_test2/Dummy/DummyState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace AutoTestClient.Dummy; 8 | 9 | public enum DummyState 10 | { 11 | None = 0, 12 | Connect = 1, 13 | Login = 2, 14 | Room = 3, 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /auto_test2/Network/PacketProcessor.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks.Dataflow; 2 | 3 | using AutoTestClient.Dummy; 4 | using AutoTestClient.PacketHandler; 5 | using CSCommon; 6 | 7 | namespace AutoTestClient.Network; 8 | 9 | public class PacketProcessor 10 | { 11 | DummyObject _dummy; 12 | //public Func GetDummyByIndexFunc; 13 | 14 | public Queue Packets { get; private set; } = new(); 15 | 16 | private Dictionary _handlers = new(); 17 | 18 | public void Init(DummyObject dummy) 19 | { 20 | _dummy = dummy; 21 | 22 | _handlers[(ushort)PacketID.ResLogin] = new ResponseLogin(); 23 | _handlers[(ushort)PacketID.ResRoomEnter] = new ResponseRoomEnter(); 24 | _handlers[(ushort)PacketID.ResRoomLeave] = new ResponseRoomLeave(); 25 | 26 | _handlers[(ushort)PacketID.NtfRoomUserList] = new NotifyRoomUserList(); 27 | _handlers[(ushort)PacketID.NtfRoomNewUser] = new NotifyRoomNewUser(); 28 | _handlers[(ushort)PacketID.NtfRoomLeaveUser] = new NotifyRoomLeaveUser(); 29 | _handlers[(ushort)PacketID.NtfRoomChat] = new NotifyRoomChat(); 30 | } 31 | 32 | 33 | public Int32 GetPacketCount() => Packets.Count; 34 | 35 | public void AddPacket(ReceivePacketInfo packetInfo) 36 | { 37 | Packets.Enqueue(packetInfo); 38 | } 39 | 40 | public void Update() 41 | { 42 | if (Packets.Count == 0) 43 | { 44 | return; 45 | } 46 | 47 | ReceivePacketInfo packetInfo = Packets.Dequeue(); 48 | 49 | try 50 | { 51 | var packetID = PacketHeadReadWrite.ReadPacketID(packetInfo.Packet); 52 | 53 | _handlers[packetID].Handle(_dummy, packetInfo.Packet); 54 | } 55 | catch (Exception ex) 56 | { 57 | Console.WriteLine(ex.ToString()); 58 | } 59 | } 60 | 61 | 62 | } -------------------------------------------------------------------------------- /auto_test2/Network/ReceivePacketInfo.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient.Network 2 | { 3 | public class ReceivePacketInfo 4 | { 5 | public Int32 DummyIndex { get; set; } 6 | 7 | public byte[] Packet { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /auto_test2/Network/temp_Receiver.cs: -------------------------------------------------------------------------------- 1 | /* 2 | namespace AutoTestClient.Network 3 | { 4 | public class Receiver 5 | { 6 | public Action ReceiveAction; 7 | 8 | private bool _isRunning = false; 9 | private Thread _updater; 10 | private Int32 _updateIntervalMilliSec; 11 | 12 | public void Init(Int32 updateIntervalMilliSec) 13 | { 14 | _updateIntervalMilliSec = updateIntervalMilliSec; 15 | _updater = new Thread(Work); 16 | } 17 | 18 | public void Start() 19 | { 20 | _isRunning = true; 21 | _updater.Start(); 22 | } 23 | 24 | public void Stop() 25 | { 26 | _isRunning = false; 27 | _updater.Join(); 28 | } 29 | 30 | private void Work() 31 | { 32 | while (_isRunning == true) 33 | { 34 | ReceiveAction(); 35 | 36 | Thread.Sleep(_updateIntervalMilliSec); 37 | } 38 | } 39 | } 40 | } 41 | */ -------------------------------------------------------------------------------- /auto_test2/NetworkTrafficData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace AutoTestClient; 8 | 9 | public class NetworkTrafficData 10 | { 11 | private long _receivedPackets; 12 | private long _sentPackets; 13 | private long _receivedBytes; 14 | private long _sentBytes; 15 | public DateTime Timestamp { get; private set; } 16 | 17 | public NetworkTrafficData() 18 | { 19 | Timestamp = DateTime.Now; 20 | } 21 | 22 | public long ReceivedPackets 23 | { 24 | get => Interlocked.Read(ref _receivedPackets); 25 | set => Interlocked.Exchange(ref _receivedPackets, value); 26 | } 27 | 28 | public long SentPackets 29 | { 30 | get => Interlocked.Read(ref _sentPackets); 31 | set => Interlocked.Exchange(ref _sentPackets, value); 32 | } 33 | 34 | public long ReceivedBytes 35 | { 36 | get => Interlocked.Read(ref _receivedBytes); 37 | set => Interlocked.Exchange(ref _receivedBytes, value); 38 | } 39 | 40 | public long SentBytes 41 | { 42 | get => Interlocked.Read(ref _sentBytes); 43 | set => Interlocked.Exchange(ref _sentBytes, value); 44 | } 45 | 46 | public void IncrementReceivedPackets() 47 | { 48 | Interlocked.Increment(ref _receivedPackets); 49 | } 50 | 51 | public void IncrementSentPackets() 52 | { 53 | Interlocked.Increment(ref _sentPackets); 54 | } 55 | 56 | public void AddReceivedBytes(long bytes) 57 | { 58 | Interlocked.Add(ref _receivedBytes, bytes); 59 | } 60 | 61 | public void AddSentBytes(long bytes) 62 | { 63 | Interlocked.Add(ref _sentBytes, bytes); 64 | } 65 | 66 | public void Reset() 67 | { 68 | Interlocked.Exchange(ref _receivedPackets, 0); 69 | Interlocked.Exchange(ref _sentPackets, 0); 70 | Interlocked.Exchange(ref _receivedBytes, 0); 71 | Interlocked.Exchange(ref _sentBytes, 0); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /auto_test2/PacketHandler/BaseHandler.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | 3 | namespace AutoTestClient.PacketHandler; 4 | 5 | public abstract class BaseHandler 6 | { 7 | public static Func GetDummyByIndexFunc; 8 | 9 | public static Func GetDummyByIDFunc; 10 | 11 | public abstract void Handle(DummyObject dummy, byte[] packet); 12 | } -------------------------------------------------------------------------------- /auto_test2/PacketHandler/NotifyRoomChat.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using CSCommon; 3 | 4 | using MemoryPack; 5 | 6 | namespace AutoTestClient.PacketHandler; 7 | 8 | public class NotifyRoomChat : BaseHandler 9 | { 10 | public override void Handle(DummyObject dummy, byte[] packet) 11 | { 12 | var notifyData = MemoryPackSerializer.Deserialize(packet); 13 | var senderID = notifyData.UserID; 14 | var senderDummy = GetDummyByIDFunc(senderID); 15 | var chatMessage = notifyData.ChatMessage; 16 | 17 | if(dummy.ID == senderID) 18 | { 19 | dummy.GetRunTimeData().CheckChatMessage(chatMessage); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /auto_test2/PacketHandler/NotifyRoomLeaveUser.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using CSCommon; 3 | 4 | using MemoryPack; 5 | using Serilog; 6 | namespace AutoTestClient.PacketHandler; 7 | 8 | public class NotifyRoomLeaveUser : BaseHandler 9 | { 10 | public override void Handle(DummyObject dummy, byte[] packet) 11 | { 12 | var notifyData = MemoryPackSerializer.Deserialize(packet); 13 | var leavedUserID = notifyData.UserID; 14 | 15 | Log.Debug($"[NotifyRoomLeaveUser] Dummy: {dummy.ID}"); 16 | } 17 | } -------------------------------------------------------------------------------- /auto_test2/PacketHandler/NotifyRoomNewUser.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using CSCommon; 3 | 4 | using MemoryPack; 5 | using Serilog; 6 | 7 | namespace AutoTestClient.PacketHandler; 8 | 9 | public class NotifyRoomNewUser : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | var notifyData = MemoryPackSerializer.Deserialize(packet); 14 | var enteredUserID = notifyData.UserID; 15 | 16 | Log.Debug($"[NotifyRoomNewUser] Dummy: {dummy.ID}"); 17 | } 18 | } -------------------------------------------------------------------------------- /auto_test2/PacketHandler/NotifyRoomUserList.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using CSCommon; 3 | 4 | using MemoryPack; 5 | 6 | namespace AutoTestClient.PacketHandler; 7 | 8 | public class NotifyRoomUserList : BaseHandler 9 | { 10 | public override void Handle(DummyObject dummy, byte[] packet) 11 | { 12 | //var notifyData = MemoryPackSerializer.Deserialize(packet); 13 | 14 | } 15 | } -------------------------------------------------------------------------------- /auto_test2/PacketHandler/ResponseLogin.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using CSCommon; 3 | 4 | using MemoryPack; 5 | using Serilog; 6 | 7 | namespace AutoTestClient.PacketHandler; 8 | 9 | public class ResponseLogin : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | var responseData = MemoryPackSerializer.Deserialize(packet); 14 | 15 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 16 | if (errorCode != CSCommon.ErrorCode.None) 17 | { 18 | Log.Error($"[ResponseLogin] Failed login with error : {errorCode}"); 19 | dummy.GetRunTimeData().AddError(errorCode, $"Failed login with error"); 20 | 21 | return; 22 | } 23 | 24 | dummy.GetRunTimeData().SetState(DummyState.Login); 25 | } 26 | } -------------------------------------------------------------------------------- /auto_test2/PacketHandler/ResponseRoomEnter.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using CSCommon; 3 | 4 | using MemoryPack; 5 | 6 | namespace AutoTestClient.PacketHandler; 7 | 8 | public class ResponseRoomEnter : BaseHandler 9 | { 10 | public override void Handle(DummyObject dummy, byte[] packet) 11 | { 12 | var responseData = MemoryPackSerializer.Deserialize(packet); 13 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 14 | if (errorCode != CSCommon.ErrorCode.None) 15 | { 16 | Console.WriteLine($"Failed EnterRoom with error : {errorCode}"); 17 | dummy.GetRunTimeData().AddError(errorCode, $"Failed Enter Room with error"); 18 | return; 19 | } 20 | 21 | dummy.GetRunTimeData().SetState(DummyState.Room); 22 | } 23 | } -------------------------------------------------------------------------------- /auto_test2/PacketHandler/ResponseRoomLeave.cs: -------------------------------------------------------------------------------- 1 | using AutoTestClient.Dummy; 2 | using CSCommon; 3 | 4 | using MemoryPack; 5 | using Serilog; 6 | 7 | namespace AutoTestClient.PacketHandler; 8 | 9 | public class ResponseRoomLeave : BaseHandler 10 | { 11 | public override void Handle(DummyObject dummy, byte[] packet) 12 | { 13 | var responseData = MemoryPackSerializer.Deserialize(packet); 14 | 15 | var errorCode = (CSCommon.ErrorCode)responseData.ErrorCode; 16 | if (errorCode != CSCommon.ErrorCode.None) 17 | { 18 | Log.Error($"[ResponseRoomLeave] Failed LeaveRoom with error : {errorCode}"); 19 | 20 | dummy.GetRunTimeData().AddError(errorCode, $"Failed LeaveRoom with error"); 21 | return; 22 | } 23 | 24 | dummy.GetRunTimeData().SetState(DummyState.Login); 25 | } 26 | } -------------------------------------------------------------------------------- /auto_test2/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "DummyTester": { 4 | "commandName": "Project", 5 | "commandLineArgs": "OnlyConnect\r\nRepeatConnect\r\nRepeatLoginOut\r\nRepeatRoomEnterLeave \r\nRepeatRoomEnterChat\r\nOnlyPlayGame" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /auto_test2/TestConfig.cs: -------------------------------------------------------------------------------- 1 | namespace AutoTestClient; 2 | 3 | public class TestConfig 4 | { 5 | public Int32 DummyCount { get; set; } 6 | 7 | // AutoTest 프로그램이 동시에 2개 이상 실행되었을 때 더미 이름이 중복되지 않도록 하기 위한 것인다. 8 | public Int32 DummyStartNumber { get; set; } 9 | 10 | public string ScenarioName { get; set; } 11 | 12 | // 테스트 실행 시간 13 | public Int32 TestRunTimeMS { get; set; } = 60000; // 60초 14 | 15 | 16 | public Int32 MaxRoomCount { get; set; } = 32; 17 | public Int32 RoomStartNumber { get; set; } = 1; 18 | public Int32 RoomUserMaxCount { get; set; } = 2; 19 | 20 | 21 | public List TaskConfigs { get; set; } 22 | 23 | public string RemoteEndPoint { get; set; } 24 | 25 | 26 | 27 | public ErrorCode Verify() 28 | { 29 | if (DummyCount < 1) 30 | { 31 | return ErrorCode.InvalidDummyCount; 32 | } 33 | 34 | if (DummyStartNumber < 0) 35 | { 36 | return ErrorCode.InvalidDummyStartNumber; 37 | } 38 | 39 | 40 | return ErrorCode.None; 41 | } 42 | 43 | public (string, Int32) stringToIPPort() 44 | { 45 | var remoteInfos = RemoteEndPoint.Split(":"); 46 | var ip = remoteInfos[0]; 47 | var port = Int32.Parse(remoteInfos[1]); 48 | 49 | return (ip, port); 50 | } 51 | 52 | 53 | } 54 | 55 | public class TaskConfig 56 | { 57 | public string TaskName { get; set; } 58 | public List NextTaskProbabilityList { get; set; } 59 | public List NextTaskWaitMinTimeMSList { get; set; } 60 | public List NextTaskWaitMaxTimeMSList { get; set; } 61 | public List NextTasks { get; set; } 62 | } 63 | 64 | -------------------------------------------------------------------------------- /cpp_vc_unittest/README.md: -------------------------------------------------------------------------------- 1 | # conf_cpp_korea_2018-08 2 | C++ Korea 제4회 세미나 - Visual C++ 에서 유닛 테스트 하기 3 | -------------------------------------------------------------------------------- /cpp_vc_unittest/[C++ Korea 4th Seminar]Visual Cpp에서 유닛 테스트 하기.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/cpp_vc_unittest/[C++ Korea 4th Seminar]Visual Cpp에서 유닛 테스트 하기.pdf -------------------------------------------------------------------------------- /cpp_vc_unittest/[C++ Korea 4th Seminar]Visual Cpp에서 유닛 테스트 하기.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/cpp_vc_unittest/[C++ Korea 4th Seminar]Visual Cpp에서 유닛 테스트 하기.pptx -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/NativeLib/Calculator.cpp: -------------------------------------------------------------------------------- 1 | #include "Calculator.h" 2 | 3 | 4 | 5 | int Calculator::Add(int a, int b) 6 | { 7 | return a + b; 8 | } -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/NativeLib/Calculator.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | 4 | class Calculator 5 | { 6 | public: 7 | Calculator() {} 8 | ~Calculator() {} 9 | 10 | int Add(int a, int b); 11 | }; -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/NativeLib/NativeLib.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NativeLib", "NativeLib.vcxproj", "{88CF59F6-CB1A-4AB0-99B4-0F9269039931}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Debug|x64.ActiveCfg = Debug|x64 17 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Debug|x64.Build.0 = Debug|x64 18 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Debug|x86.ActiveCfg = Debug|Win32 19 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Debug|x86.Build.0 = Debug|Win32 20 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Release|x64.ActiveCfg = Release|x64 21 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Release|x64.Build.0 = Release|x64 22 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Release|x86.ActiveCfg = Release|Win32 23 | {88CF59F6-CB1A-4AB0-99B4-0F9269039931}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/NativeLib/NativeLib.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 헤더 파일 23 | 24 | 25 | 26 | 27 | 소스 파일 28 | 29 | 30 | -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/NativeLib/ReadMe.txt: -------------------------------------------------------------------------------- 1 | ======================================================================== 2 | 정적 라이브러리 : NativeLib 프로젝트 개요 3 | ======================================================================== 4 | 5 | 응용 프로그램 마법사에서 이 NativeLib 라이브러리 프로젝트를 만들었습니다. 6 | 7 | 프로젝트에 대해 소스 파일은 만들어지지 않았습니다. 8 | 9 | 10 | NativeLib.vcxproj 11 | 응용 프로그램 마법사를 사용하여 생성한 VC++ 프로젝트의 기본 프로젝트 파일입니다. 파일을 생성한 Visual C++ 버전에 대한 정보와 응용 프로그램 마법사를 사용하여 선택한 플랫폼, 구성 및 프로젝트 기능에 대한 정보가 포함되어 있습니다. 12 | 13 | NativeLib.vcxproj.filters 14 | 응용 프로그램 마법사를 사용하여 생성된 VC++ 프로젝트의 필터 파일입니다. 이 파일에는 프로젝트의 파일과 필터 간의 연결 정보가 들어 있습니다. 이러한 연결은 특정 노드에서 유사한 확장명으로 그룹화된 파일을 표시하기 위해 IDE에서 사용됩니다. 예를 들어 ".cpp" 파일은 "소스 파일" 필터와 연결되어 있습니다. 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | 기타 참고: 18 | 19 | 응용 프로그램 마법사에서 사용하는 "TODO:" 주석은 사용자가 추가하거나 사용자 지정해야 하는 소스 코드 부분을 나타냅니다. 20 | 21 | ///////////////////////////////////////////////////////////////////////////// 22 | -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/UnitTest1.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | 헤더 파일 20 | 21 | 22 | 헤더 파일 23 | 24 | 25 | 26 | 27 | 소스 파일 28 | 29 | 30 | 소스 파일 31 | 32 | 33 | -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/stdafx.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/stdafx.cpp -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/stdafx.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/stdafx.h -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/targetver.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/targetver.h -------------------------------------------------------------------------------- /cpp_vc_unittest/유닛테스트 참고 코드/UnitTest1/unittest1.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "CppUnitTest.h" 3 | 4 | #include "..\NativeLib\Calculator.h" 5 | 6 | 7 | using namespace Microsoft::VisualStudio::CppUnitTestFramework; 8 | 9 | namespace UnitTest1 10 | { 11 | TEST_CLASS(UnitTest1) 12 | { 13 | public: 14 | 15 | TEST_METHOD(TestMethod1) 16 | { 17 | Calculator cal; 18 | Assert::AreEqual(3, cal.Add(1, 2)); 19 | } 20 | 21 | }; 22 | } -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Choi HeungBae 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/CSCommon/CSErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | public enum ErrorCode 8 | { 9 | None = 0, // 에러가 아니다 10 | 11 | // 서버 초기화 에라 12 | REDIS_INIT_FAIL = 1, // Redis 초기화 에러 13 | 14 | // 로그인 15 | LOGIN_INVALID_AUTHTOKEN = 1001, // 로그인 실패: 잘못된 인증 토큰 16 | ADD_USER_DUPLICATION = 1002, 17 | LOGIN_INVALID_SESSION_ID = 1003, 18 | REMOVE_USER_SEARCH_FAILURE_USER_ID = 1004, 19 | USER_AUTH_SEARCH_FAILURE_USER_ID = 1005, 20 | USER_AUTH_ALREADY_SET_AUTH = 1006, 21 | LOGIN_ALREADY_WORKING = 1007, 22 | LOGIN_FULL_USER_COUNT = 1008, 23 | LOGIN_NOT_EXIST_CLIENT_SESSION = 1009, 24 | LOGIN_NOT_FOUND_USER = 1010, 25 | LOGIN_SESSION_EXPIRED = 1011, 26 | 27 | DB_LOGIN_INVALID_PASSWORD = 1012, 28 | DB_LOGIN_EMPTY_USER = 1013, 29 | DB_LOGIN_EXCEPTION = 1014, 30 | 31 | ROOM_INVALID_STATE = 1021, 32 | ROOM_INVALID_USER = 1022, 33 | ROOM_ERROR_SYSTEM = 1023, 34 | ROOM_INVALID_ROOM_NUMBER = 1024, 35 | ROOM_FAIL_ADD_USER = 1025, 36 | 37 | OMOK_OVERFLOW = 1031, 38 | OMOK_ALREADY_EXIST = 1032, 39 | OMOK_RENJURULE = 1033, // 쌍삼 40 | OMOK_TURN_NOT_MATCH = 1034, 41 | OMOK_NOT_STARTED = 1035, 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/CSCommon/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | // 1001 ~ 2000 8 | public class PacketID 9 | { 10 | public const UInt16 BEGIN = 1001; 11 | 12 | public const UInt16 ReqLogin = 1002; 13 | public const UInt16 ResLogin = 1003; 14 | 15 | public const UInt16 NtfMustClose = 1005; 16 | 17 | public const UInt16 ReqRoomEnter = 1015; 18 | public const UInt16 ResRoomEnter = 1016; 19 | public const UInt16 NtfRoomUserList = 1017; 20 | public const UInt16 NtfRoomNewUser = 1018; 21 | 22 | public const UInt16 ReqRoomLeave = 1021; 23 | public const UInt16 ResRoomLeave = 1022; 24 | public const UInt16 NtfRoomLeaveUser = 1023; 25 | 26 | public const UInt16 ReqRoomChat = 1026; 27 | public const UInt16 ResRoomChat = 1027; 28 | public const UInt16 NtfRoomChat = 1028; 29 | 30 | public const UInt16 ReqReadyOmok = 1031; 31 | public const UInt16 ResReadyOmok = 1032; 32 | public const UInt16 NtfReadyOmok = 1033; 33 | 34 | public const UInt16 NtfStartOmok = 1034; 35 | 36 | public const UInt16 ReqPutMok = 1035; 37 | public const UInt16 ResPutMok = 1036; 38 | public const UInt16 NTFPutMok = 1037; 39 | 40 | public const UInt16 NTFEndOmok = 1038; 41 | 42 | 43 | public const UInt16 END = 1100; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/DevLog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using System.Runtime.CompilerServices; 8 | using System.Threading; 9 | 10 | namespace OmokClient 11 | { 12 | public class DevLog 13 | { 14 | static System.Collections.Concurrent.ConcurrentQueue logMsgQueue = new System.Collections.Concurrent.ConcurrentQueue(); 15 | 16 | static Int64 출력가능_로그레벨 = (Int64)LOG_LEVEL.TRACE; 17 | 18 | 19 | 20 | static public void Init(LOG_LEVEL logLevel) 21 | { 22 | ChangeLogLevel(logLevel); 23 | } 24 | 25 | static public void ChangeLogLevel(LOG_LEVEL logLevel) 26 | { 27 | Interlocked.Exchange(ref 출력가능_로그레벨, (int)logLevel); 28 | } 29 | 30 | public static LOG_LEVEL CurrentLogLevel() 31 | { 32 | var curLogLevel = (LOG_LEVEL)Interlocked.Read(ref 출력가능_로그레벨); 33 | return curLogLevel; 34 | } 35 | 36 | static public void Write(string msg, LOG_LEVEL logLevel = LOG_LEVEL.TRACE, 37 | [CallerFilePath] string fileName = "", 38 | [CallerMemberName] string methodName = "", 39 | [CallerLineNumber] int lineNumber = 0) 40 | { 41 | if (CurrentLogLevel() <= logLevel) 42 | { 43 | logMsgQueue.Enqueue(string.Format("{0}:{1}| {2}", DateTime.Now, methodName, msg)); 44 | } 45 | } 46 | 47 | static public bool GetLog(out string msg) 48 | { 49 | if (logMsgQueue.TryDequeue(out msg)) 50 | { 51 | return true; 52 | } 53 | 54 | return false; 55 | } 56 | 57 | } 58 | 59 | 60 | public enum LOG_LEVEL 61 | { 62 | TRACE, 63 | DEBUG, 64 | INFO, 65 | WARN, 66 | ERROR, 67 | DISABLE 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/OmokClient.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net7.0-windows 6 | true 7 | OmokClient.Program 8 | 9 | 10 | 11 | true 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | PreserveNewest 25 | 26 | 27 | PreserveNewest 28 | 29 | 30 | PreserveNewest 31 | 32 | 33 | PreserveNewest 34 | 35 | 36 | PreserveNewest 37 | 38 | 39 | PreserveNewest 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/OmokClient.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.31727.386 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OmokClient", "OmokClient.csproj", "{9838137A-A880-4B12-8638-99254CB72C5B}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {9838137A-A880-4B12-8638-99254CB72C5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {9838137A-A880-4B12-8638-99254CB72C5B}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {9838137A-A880-4B12-8638-99254CB72C5B}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {9838137A-A880-4B12-8638-99254CB72C5B}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {0FB90A41-2700-49A1-8A5D-A1F22B4EE7E8} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace OmokClient 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.SetHighDpiMode(HighDpiMode.SystemAware); 18 | Application.EnableVisualStyles(); 19 | Application.SetCompatibleTextRenderingDefault(false); 20 | Application.Run(new MainForm()); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/대국승리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/대국승리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/대국시작.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/대국시작.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/대국종료.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/대국종료.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/무르기.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/무르기.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/바둑돌소리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/바둑돌소리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/오류.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_0/OmokClient_CSharp/sound/오류.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/README.md: -------------------------------------------------------------------------------- 1 | # 서버 테스트를 위한 테스트용 클라이언트 모음 2 | 3 | 4 | # C# 오목 클라이언트 5 | ![](./images/001.png) 6 | - 디렉토리: `OmokClient_CSharp` 7 | - .NET 7, Winform 8 | - 패킷 데이터는 MessagePack for C#으로 직렬화한다 9 | - 자신이 만든 오목 게임에 맞게 수정하면 된다. 10 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_0/images/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_0/images/001.png -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/CSCommon/CSErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | public enum ErrorCode 8 | { 9 | None = 0, // 에러가 아니다 10 | 11 | // 서버 초기화 에라 12 | REDIS_INIT_FAIL = 1, // Redis 초기화 에러 13 | 14 | // 로그인 15 | LOGIN_INVALID_AUTHTOKEN = 1001, // 로그인 실패: 잘못된 인증 토큰 16 | ADD_USER_DUPLICATION = 1002, 17 | LOGIN_INVALID_SESSION_ID = 1003, 18 | REMOVE_USER_SEARCH_FAILURE_USER_ID = 1004, 19 | USER_AUTH_SEARCH_FAILURE_USER_ID = 1005, 20 | USER_AUTH_ALREADY_SET_AUTH = 1006, 21 | LOGIN_ALREADY_WORKING = 1007, 22 | LOGIN_FULL_USER_COUNT = 1008, 23 | LOGIN_NOT_EXIST_CLIENT_SESSION = 1009, 24 | LOGIN_NOT_FOUND_USER = 1010, 25 | LOGIN_SESSION_EXPIRED = 1011, 26 | 27 | DB_LOGIN_INVALID_PASSWORD = 1012, 28 | DB_LOGIN_EMPTY_USER = 1013, 29 | DB_LOGIN_EXCEPTION = 1014, 30 | 31 | ROOM_INVALID_STATE = 1021, 32 | ROOM_INVALID_USER = 1022, 33 | ROOM_ERROR_SYSTEM = 1023, 34 | ROOM_INVALID_ROOM_NUMBER = 1024, 35 | ROOM_FAIL_ADD_USER = 1025, 36 | 37 | OMOK_OVERFLOW = 1031, 38 | OMOK_ALREADY_EXIST = 1032, 39 | OMOK_RENJURULE = 1033, // 쌍삼 40 | OMOK_TURN_NOT_MATCH = 1034, 41 | OMOK_NOT_STARTED = 1035, 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/CSCommon/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | // 1001 ~ 2000 8 | public class PacketID 9 | { 10 | public const UInt16 BEGIN = 1001; 11 | 12 | public const UInt16 ReqLogin = 1002; 13 | public const UInt16 ResLogin = 1003; 14 | 15 | public const UInt16 NtfMustClose = 1005; 16 | 17 | public const UInt16 ReqRoomEnter = 1015; 18 | public const UInt16 ResRoomEnter = 1016; 19 | public const UInt16 NtfRoomUserList = 1017; 20 | public const UInt16 NtfRoomNewUser = 1018; 21 | 22 | public const UInt16 ReqRoomLeave = 1021; 23 | public const UInt16 ResRoomLeave = 1022; 24 | public const UInt16 NtfRoomLeaveUser = 1023; 25 | 26 | public const UInt16 ReqRoomChat = 1026; 27 | public const UInt16 ResRoomChat = 1027; 28 | public const UInt16 NtfRoomChat = 1028; 29 | 30 | public const UInt16 ReqReadyOmok = 1031; 31 | public const UInt16 ResReadyOmok = 1032; 32 | public const UInt16 NtfReadyOmok = 1033; 33 | 34 | public const UInt16 NtfStartOmok = 1034; 35 | 36 | public const UInt16 ReqPutMok = 1035; 37 | public const UInt16 ResPutMok = 1036; 38 | public const UInt16 NTFPutMok = 1037; 39 | 40 | public const UInt16 NTFEndOmok = 1038; 41 | 42 | 43 | public const UInt16 END = 1100; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/CSErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | 8 | // 1000 ~ 19999 9 | public enum ErrorCode : UInt16 10 | { 11 | None = 0, 12 | 13 | GWLoginRedisCantFound = 1021, 14 | GWLoginRedisAlwaysCurState = 1022, 15 | 16 | LobbyEnterDisableEnter = 1031, 17 | /*LoginFail = 1042, 18 | LoginAlreadyLogin = 1043, 19 | 20 | LobbyEnterLobbyOverflow = 1050, 21 | LobbyEnterInvaildUser = 1051, 22 | 23 | RoomLeaveFail = 1060,*/ 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/DevLog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using System.Runtime.CompilerServices; 8 | using System.Threading; 9 | 10 | namespace csharp_test_client 11 | { 12 | public class DevLog 13 | { 14 | static System.Collections.Concurrent.ConcurrentQueue logMsgQueue = new System.Collections.Concurrent.ConcurrentQueue(); 15 | 16 | static Int64 출력가능_로그레벨 = (Int64)LOG_LEVEL.TRACE; 17 | 18 | 19 | 20 | static public void Init(LOG_LEVEL logLevel) 21 | { 22 | ChangeLogLevel(logLevel); 23 | } 24 | 25 | static public void ChangeLogLevel(LOG_LEVEL logLevel) 26 | { 27 | Interlocked.Exchange(ref 출력가능_로그레벨, (int)logLevel); 28 | } 29 | 30 | public static LOG_LEVEL CurrentLogLevel() 31 | { 32 | var curLogLevel = (LOG_LEVEL)Interlocked.Read(ref 출력가능_로그레벨); 33 | return curLogLevel; 34 | } 35 | 36 | static public void Write(string msg, LOG_LEVEL logLevel = LOG_LEVEL.TRACE, 37 | [CallerFilePath] string fileName = "", 38 | [CallerMemberName] string methodName = "", 39 | [CallerLineNumber] int lineNumber = 0) 40 | { 41 | if (CurrentLogLevel() <= logLevel) 42 | { 43 | logMsgQueue.Enqueue(string.Format("{0}:{1}| {2}", DateTime.Now, methodName, msg)); 44 | } 45 | } 46 | 47 | static public bool GetLog(out string msg) 48 | { 49 | if (logMsgQueue.TryDequeue(out msg)) 50 | { 51 | return true; 52 | } 53 | 54 | return false; 55 | } 56 | 57 | } 58 | 59 | 60 | public enum LOG_LEVEL 61 | { 62 | TRACE, 63 | DEBUG, 64 | INFO, 65 | WARN, 66 | ERROR, 67 | DISABLE 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/OmokClient.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | net8.0-windows10.0.17763.0 4 | WinExe 5 | false 6 | false 7 | true 8 | true 9 | 10 | 11 | ..\00_bin_omok_client\ 12 | true 13 | 14 | 15 | ..\00_bin_omok_client\ 16 | 17 | 18 | 19 | 3.2.0 20 | 21 | 22 | 2.5.140 23 | 24 | 25 | 26 | 2.1.1 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/OmokClient.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30406.217 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OmokClient", "OmokClient.csproj", "{9E4B5E72-4E76-4E22-90B0-E53275A99018}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {48B61978-8998-4F6B-861E-3F0C6D340A5B} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | // Client - GatewayServer PacketID 정의 8 | // 101 ~ 500 9 | public class PacketID 10 | { 11 | public const UInt16 BEGIN = 101; 12 | 13 | 14 | public const UInt16 NtfMustClose = 102; 15 | 16 | public const UInt16 ReqLogin = 111; 17 | public const UInt16 ResLogin = 112; 18 | 19 | public const UInt16 ReqLobbyEnter = 121; 20 | public const UInt16 ResLobbyEnter = 122; 21 | public const UInt16 NtfLobbyEnterNewUser = 123; 22 | 23 | public const UInt16 ReqLobbyLeave = 126; 24 | public const UInt16 ResLobbyLeave = 127; 25 | public const UInt16 NtfLobbyLeaveUser = 128; 26 | 27 | public const UInt16 RelayLobbyBegin = 131; 28 | public const UInt16 ReqLobbyChat = 136; 29 | public const UInt16 NtfLobbyChat = 137; 30 | public const UInt16 RelayLobbyEnd = 171; 31 | 32 | 33 | 34 | 35 | public const UInt16 ReqRoomEnter = 211; 36 | public const UInt16 ResRoomEnter = 212; 37 | 38 | public const UInt16 ReqRoomLeave = 216; 39 | public const UInt16 ResRoomLeave = 217; 40 | 41 | 42 | public const UInt16 NTFGameInfo = 251; 43 | public const UInt16 ReqGamePut = 252; 44 | public const UInt16 NTFGamePut = 253; 45 | public const UInt16 NTFGameResult = 256; 46 | 47 | 48 | public const UInt16 END = 500; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.Versioning; 5 | using System.Threading.Tasks; 6 | using System.Windows.Forms; 7 | 8 | namespace csharp_test_client 9 | { 10 | [SupportedOSPlatform("windows10.0.177630")] 11 | static class Program 12 | { 13 | /// 14 | /// 해당 응용 프로그램의 주 진입점입니다. 15 | /// 16 | [STAThread] 17 | static void Main() 18 | { 19 | Application.EnableVisualStyles(); 20 | Application.SetCompatibleTextRenderingDefault(false); 21 | Application.Run(new mainForm()); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 6 | // 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 7 | // 이러한 특성 값을 변경하세요. 8 | [assembly: AssemblyTitle("Omok")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Omok")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 18 | // 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 19 | // 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. 20 | [assembly: ComVisible(false)] 21 | 22 | // 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. 23 | [assembly: Guid("d9b817d4-481b-466a-b52c-725a94deec97")] 24 | 25 | // 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. 26 | // 27 | // 주 버전 28 | // 부 버전 29 | // 빌드 번호 30 | // 수정 버전 31 | // 32 | // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 33 | // 지정되도록 할 수 있습니다. 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Omok.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/sound/대국승리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_1/sound/대국승리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/sound/대국시작.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_1/sound/대국시작.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/sound/대국종료.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_1/sound/대국종료.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/sound/무르기.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_1/sound/무르기.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/sound/바둑돌소리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_1/sound/바둑돌소리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_1/sound/오류.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_1/sound/오류.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/CSCommon/CSErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | public enum ErrorCode 8 | { 9 | None = 0, // 에러가 아니다 10 | 11 | // 서버 초기화 에라 12 | REDIS_INIT_FAIL = 1, // Redis 초기화 에러 13 | 14 | // 로그인 15 | LOGIN_INVALID_AUTHTOKEN = 1001, // 로그인 실패: 잘못된 인증 토큰 16 | ADD_USER_DUPLICATION = 1002, 17 | LOGIN_INVALID_SESSION_ID = 1003, 18 | REMOVE_USER_SEARCH_FAILURE_USER_ID = 1004, 19 | USER_AUTH_SEARCH_FAILURE_USER_ID = 1005, 20 | USER_AUTH_ALREADY_SET_AUTH = 1006, 21 | LOGIN_ALREADY_WORKING = 1007, 22 | LOGIN_FULL_USER_COUNT = 1008, 23 | LOGIN_NOT_EXIST_CLIENT_SESSION = 1009, 24 | LOGIN_NOT_FOUND_USER = 1010, 25 | LOGIN_SESSION_EXPIRED = 1011, 26 | 27 | DB_LOGIN_INVALID_PASSWORD = 1012, 28 | DB_LOGIN_EMPTY_USER = 1013, 29 | DB_LOGIN_EXCEPTION = 1014, 30 | 31 | ROOM_INVALID_STATE = 1021, 32 | ROOM_INVALID_USER = 1022, 33 | ROOM_ERROR_SYSTEM = 1023, 34 | ROOM_INVALID_ROOM_NUMBER = 1024, 35 | ROOM_FAIL_ADD_USER = 1025, 36 | 37 | OMOK_OVERFLOW = 1031, 38 | OMOK_ALREADY_EXIST = 1032, 39 | OMOK_RENJURULE = 1033, // 쌍삼 40 | OMOK_TURN_NOT_MATCH = 1034, 41 | OMOK_NOT_STARTED = 1035, 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/CSCommon/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | // 1001 ~ 2000 8 | public class PacketID 9 | { 10 | 11 | public const UInt16 ReqLogin = 1002; 12 | public const UInt16 ResLogin = 1003; 13 | 14 | public const UInt16 NtfMustClose = 1005; 15 | 16 | public const UInt16 ReqRoomEnter = 1015; 17 | public const UInt16 ResRoomEnter = 1016; 18 | public const UInt16 NtfRoomUserList = 1017; 19 | public const UInt16 NtfRoomNewUser = 1018; 20 | 21 | public const UInt16 ReqRoomLeave = 1021; 22 | public const UInt16 ResRoomLeave = 1022; 23 | public const UInt16 NtfRoomLeaveUser = 1023; 24 | 25 | public const UInt16 ReqRoomChat = 1026; 26 | public const UInt16 ResRoomChat = 1027; 27 | public const UInt16 NtfRoomChat = 1028; 28 | 29 | public const UInt16 ReqReadyOmok = 1031; 30 | public const UInt16 ResReadyOmok = 1032; 31 | public const UInt16 NtfReadyOmok = 1033; 32 | 33 | public const UInt16 NtfStartOmok = 1034; 34 | 35 | public const UInt16 ReqPutMok = 1035; 36 | public const UInt16 ResPutMok = 1036; 37 | public const UInt16 NTFPutMok = 1037; 38 | 39 | public const UInt16 NTFEndOmok = 1038; 40 | 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/CSErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | 8 | // 1000 ~ 19999 9 | public enum ErrorCode : UInt16 10 | { 11 | None = 0, 12 | 13 | GWLoginRedisCantFound = 1021, 14 | GWLoginRedisAlwaysCurState = 1022, 15 | 16 | LobbyEnterDisableEnter = 1031, 17 | /*LoginFail = 1042, 18 | LoginAlreadyLogin = 1043, 19 | 20 | LobbyEnterLobbyOverflow = 1050, 21 | LobbyEnterInvaildUser = 1051, 22 | 23 | RoomLeaveFail = 1060,*/ 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/DevLog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using System.Runtime.CompilerServices; 8 | using System.Threading; 9 | 10 | namespace csharp_test_client 11 | { 12 | public class DevLog 13 | { 14 | static System.Collections.Concurrent.ConcurrentQueue logMsgQueue = new System.Collections.Concurrent.ConcurrentQueue(); 15 | 16 | static Int64 출력가능_로그레벨 = (Int64)LOG_LEVEL.TRACE; 17 | 18 | 19 | 20 | static public void Init(LOG_LEVEL logLevel) 21 | { 22 | ChangeLogLevel(logLevel); 23 | } 24 | 25 | static public void ChangeLogLevel(LOG_LEVEL logLevel) 26 | { 27 | Interlocked.Exchange(ref 출력가능_로그레벨, (int)logLevel); 28 | } 29 | 30 | public static LOG_LEVEL CurrentLogLevel() 31 | { 32 | var curLogLevel = (LOG_LEVEL)Interlocked.Read(ref 출력가능_로그레벨); 33 | return curLogLevel; 34 | } 35 | 36 | static public void Write(string msg, LOG_LEVEL logLevel = LOG_LEVEL.TRACE, 37 | [CallerFilePath] string fileName = "", 38 | [CallerMemberName] string methodName = "", 39 | [CallerLineNumber] int lineNumber = 0) 40 | { 41 | if (CurrentLogLevel() <= logLevel) 42 | { 43 | logMsgQueue.Enqueue(string.Format("{0}:{1}| {2}", DateTime.Now, methodName, msg)); 44 | } 45 | } 46 | 47 | static public bool GetLog(out string msg) 48 | { 49 | if (logMsgQueue.TryDequeue(out msg)) 50 | { 51 | return true; 52 | } 53 | 54 | return false; 55 | } 56 | 57 | } 58 | 59 | 60 | public enum LOG_LEVEL 61 | { 62 | TRACE, 63 | DEBUG, 64 | INFO, 65 | WARN, 66 | ERROR, 67 | DISABLE 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/OmokClient.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30406.217 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OmokClient", "OmokClient.csproj", "{9E4B5E72-4E76-4E22-90B0-E53275A99018}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {48B61978-8998-4F6B-861E-3F0C6D340A5B} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | // Client - GatewayServer PacketID 정의 8 | // 101 ~ 500 9 | public class PacketID 10 | { 11 | public const UInt16 BEGIN = 101; 12 | 13 | 14 | public const UInt16 NtfMustClose = 102; 15 | 16 | public const UInt16 ReqLogin = 111; 17 | public const UInt16 ResLogin = 112; 18 | 19 | public const UInt16 ReqLobbyEnter = 121; 20 | public const UInt16 ResLobbyEnter = 122; 21 | public const UInt16 NtfLobbyEnterNewUser = 123; 22 | 23 | public const UInt16 ReqLobbyLeave = 126; 24 | public const UInt16 ResLobbyLeave = 127; 25 | public const UInt16 NtfLobbyLeaveUser = 128; 26 | 27 | public const UInt16 RelayLobbyBegin = 131; 28 | public const UInt16 ReqLobbyChat = 136; 29 | public const UInt16 NtfLobbyChat = 137; 30 | public const UInt16 RelayLobbyEnd = 171; 31 | 32 | 33 | 34 | 35 | public const UInt16 ReqRoomEnter = 211; 36 | public const UInt16 ResRoomEnter = 212; 37 | 38 | public const UInt16 ReqRoomLeave = 216; 39 | public const UInt16 ResRoomLeave = 217; 40 | 41 | 42 | public const UInt16 NTFGameInfo = 251; 43 | public const UInt16 ReqGamePut = 252; 44 | public const UInt16 NTFGamePut = 253; 45 | public const UInt16 NTFGameResult = 256; 46 | 47 | 48 | public const UInt16 END = 500; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.Versioning; 5 | using System.Threading.Tasks; 6 | using System.Windows.Forms; 7 | 8 | namespace csharp_test_client 9 | { 10 | [SupportedOSPlatform("windows10.0.177630")] 11 | static class Program 12 | { 13 | /// 14 | /// 해당 응용 프로그램의 주 진입점입니다. 15 | /// 16 | [STAThread] 17 | static void Main() 18 | { 19 | Application.EnableVisualStyles(); 20 | Application.SetCompatibleTextRenderingDefault(false); 21 | Application.Run(new mainForm()); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Omok.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/sound/대국승리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_2/sound/대국승리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/sound/대국시작.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_2/sound/대국시작.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/sound/대국종료.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_2/sound/대국종료.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/sound/무르기.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_2/sound/무르기.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/sound/바둑돌소리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_2/sound/바둑돌소리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_2/sound/오류.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_2/sound/오류.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/CSCommon/CSErrorCode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | 8 | // 1000 ~ 19999 9 | public enum ErrorCode : UInt16 10 | { 11 | None = 0, 12 | 13 | GWLoginRedisCantFound = 1021, 14 | GWLoginRedisAlwaysCurState = 1022, 15 | 16 | LobbyEnterDisableEnter = 1031, 17 | /*LoginFail = 1042, 18 | LoginAlreadyLogin = 1043, 19 | 20 | LobbyEnterLobbyOverflow = 1050, 21 | LobbyEnterInvaildUser = 1051, 22 | 23 | RoomLeaveFail = 1060,*/ 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/CSCommon/PacketID.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | 5 | namespace CSCommon 6 | { 7 | // Client - GatewayServer PacketID 정의 8 | // 101 ~ 500 9 | public class PacketID 10 | { 11 | public const UInt16 BEGIN = 101; 12 | 13 | 14 | public const UInt16 NtfMustClose = 102; 15 | 16 | public const UInt16 ReqLogin = 111; 17 | public const UInt16 ResLogin = 112; 18 | 19 | public const UInt16 ReqLobbyEnter = 121; 20 | public const UInt16 ResLobbyEnter = 122; 21 | public const UInt16 NtfLobbyEnterNewUser = 123; 22 | 23 | public const UInt16 ReqLobbyLeave = 126; 24 | public const UInt16 ResLobbyLeave = 127; 25 | public const UInt16 NtfLobbyLeaveUser = 128; 26 | 27 | public const UInt16 RelayLobbyBegin = 131; 28 | public const UInt16 ReqLobbyChat = 136; 29 | public const UInt16 NtfLobbyChat = 137; 30 | public const UInt16 RelayLobbyEnd = 171; 31 | 32 | 33 | 34 | 35 | public const UInt16 ReqRoomEnter = 211; 36 | public const UInt16 ResRoomEnter = 212; 37 | 38 | public const UInt16 ReqRoomLeave = 216; 39 | public const UInt16 ResRoomLeave = 217; 40 | 41 | 42 | public const UInt16 NTFGameInfo = 251; 43 | public const UInt16 ReqGamePut = 252; 44 | public const UInt16 NTFGamePut = 253; 45 | public const UInt16 NTFGameResult = 256; 46 | 47 | 48 | public const UInt16 END = 500; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/DevLog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using System.Runtime.CompilerServices; 8 | using System.Threading; 9 | 10 | namespace csharp_test_client 11 | { 12 | public class DevLog 13 | { 14 | static System.Collections.Concurrent.ConcurrentQueue logMsgQueue = new System.Collections.Concurrent.ConcurrentQueue(); 15 | 16 | static Int64 출력가능_로그레벨 = (Int64)LOG_LEVEL.TRACE; 17 | 18 | 19 | 20 | static public void Init(LOG_LEVEL logLevel) 21 | { 22 | ChangeLogLevel(logLevel); 23 | } 24 | 25 | static public void ChangeLogLevel(LOG_LEVEL logLevel) 26 | { 27 | Interlocked.Exchange(ref 출력가능_로그레벨, (int)logLevel); 28 | } 29 | 30 | public static LOG_LEVEL CurrentLogLevel() 31 | { 32 | var curLogLevel = (LOG_LEVEL)Interlocked.Read(ref 출력가능_로그레벨); 33 | return curLogLevel; 34 | } 35 | 36 | static public void Write(string msg, LOG_LEVEL logLevel = LOG_LEVEL.TRACE, 37 | [CallerFilePath] string fileName = "", 38 | [CallerMemberName] string methodName = "", 39 | [CallerLineNumber] int lineNumber = 0) 40 | { 41 | if (CurrentLogLevel() <= logLevel) 42 | { 43 | logMsgQueue.Enqueue(string.Format("{0}:{1}| {2}", DateTime.Now, methodName, msg)); 44 | } 45 | } 46 | 47 | static public bool GetLog(out string msg) 48 | { 49 | if (logMsgQueue.TryDequeue(out msg)) 50 | { 51 | return true; 52 | } 53 | 54 | return false; 55 | } 56 | 57 | } 58 | 59 | 60 | public enum LOG_LEVEL 61 | { 62 | TRACE, 63 | DEBUG, 64 | INFO, 65 | WARN, 66 | ERROR, 67 | DISABLE 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/OmokClient.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.8.34330.188 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OmokClient", "OmokClient.csproj", "{9E4B5E72-4E76-4E22-90B0-E53275A99018}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {9E4B5E72-4E76-4E22-90B0-E53275A99018}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {48B61978-8998-4F6B-861E-3F0C6D340A5B} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Runtime.Versioning; 5 | using System.Threading.Tasks; 6 | using System.Windows.Forms; 7 | 8 | namespace csharp_test_client 9 | { 10 | [SupportedOSPlatform("windows10.0.177630")] 11 | static class Program 12 | { 13 | /// 14 | /// 해당 응용 프로그램의 주 진입점입니다. 15 | /// 16 | [STAThread] 17 | static void Main() 18 | { 19 | Application.EnableVisualStyles(); 20 | Application.SetCompatibleTextRenderingDefault(false); 21 | Application.Run(new mainForm()); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Omok.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/sound/대국승리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_3/sound/대국승리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/sound/대국시작.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_3/sound/대국시작.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/sound/대국종료.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_3/sound/대국종료.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/sound/무르기.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_3/sound/무르기.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/sound/바둑돌소리.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_3/sound/바둑돌소리.wav -------------------------------------------------------------------------------- /csharp_omok_client/CSharp_OmokClient_3/sound/오류.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/CSharp_OmokClient_3/sound/오류.wav -------------------------------------------------------------------------------- /csharp_omok_client/README.md: -------------------------------------------------------------------------------- 1 | # 오목 클라이언트 코드 저장소 2 | 3 | ## CSharp_OmokClient_0 4 | - .NET 7 5 | - WinForm 6 | - 네트워크 클라이언트용으로 만든 것 7 | - 패킷 데이터 포맷은 MessagePack을 사용 8 | - 아래 버전과 달리 경고 없이 빌드 잘 되고, WinForm 디자이너에서 GUI 화면을 볼 수 있다 9 | 10 | 11 | ## CSharp_OmokClient_1 , CSharp_OmokClient_3 12 | - .NET 8 13 | - WinForm 14 | - 네트워크 클라이언트용으로 만든 것 15 | - 패킷 데이터 포맷은 MessagePack을 사용 16 | - 닷넷프레임워크 때 만든 Winform에서 마이그레이션 하면서 지원하지 않는 라이브러리 문제로 디자인시에 폼 디자이너가 나오지 않음. 실행에는 문제 없음 17 | 18 | 19 | ## CSharp_OmokClient_2 20 | - .NET 8 21 | - WinForm 22 | - 네트워크 클라이언트용으로 만든 것 23 | - 패킷 데이터 포맷은 바이너리를 사용 24 | - 닷넷프레임워크 때 만든 Winform에서 마이그레이션 하면서 지원하지 않는 라이브러리 문제로 디자인시에 폼 디자이너가 나오지 않음. 실행에는 문제 없음 25 | 26 | 27 | ## 클라이언트 실행 모습 28 | CSharp_OmokClient_1 , CSharp_OmokClient_2 , CSharp_OmokClient_3 의 공통된 모습 29 | ![CSharp_OmokClient](./images/001.png) 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /csharp_omok_client/images/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/csharp_omok_client/images/001.png -------------------------------------------------------------------------------- /db_sharding_explained.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/db_sharding_explained.png -------------------------------------------------------------------------------- /docker/docker-202301_ksy/APIServer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env 2 | 3 | WORKDIR /App 4 | 5 | COPY *.csproj ./ 6 | RUN dotnet restore 7 | 8 | COPY . ./ 9 | RUN dotnet publish -c Release -o out 10 | EXPOSE 11500 11 | 12 | # Build runtime image 13 | FROM mcr.microsoft.com/dotnet/aspnet:8.0 14 | WORKDIR /App 15 | COPY --from=build-env /App/out . 16 | ENTRYPOINT ["dotnet", "APIServer.dll"] -------------------------------------------------------------------------------- /docker/docker-202301_ksy/APIServer/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docker/docker-202301_ksy/APIServer/README.md -------------------------------------------------------------------------------- /docker/docker-202301_ksy/DB/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mysql:8.2 2 | 3 | ENV MYSQL_ROOT_PASSWORD=Rlatjd095980! 4 | 5 | COPY ./Dump.sql /docker-entrypoint-initdb.d/ 6 | 7 | EXPOSE 3306 8 | 9 | CMD ["mysqld","--character-set-server=utf8", "--collation-server=utf8_general_ci"] -------------------------------------------------------------------------------- /docker/docker-202301_ksy/FakeHiveServer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env 2 | WORKDIR /App 3 | 4 | COPY *.csproj ./ 5 | RUN dotnet restore 6 | 7 | COPY . ./ 8 | RUN dotnet publish -c Release -o out 9 | EXPOSE 11501 10 | 11 | # Build runtime image 12 | FROM mcr.microsoft.com/dotnet/aspnet:8.0 13 | WORKDIR /App 14 | COPY --from=build-env /App/out . 15 | ENTRYPOINT ["dotnet", "HiveAPIServer.dll"] -------------------------------------------------------------------------------- /docker/docker-202301_ksy/FakeHiveServer/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docker/docker-202301_ksy/FakeHiveServer/README.md -------------------------------------------------------------------------------- /docker/docker-202301_ksy/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: "1.0" 3 | 4 | services: 5 | db: 6 | image: mydbimage 7 | container_name: mydb 8 | build: 9 | context: ./DB 10 | dockerfile: Dockerfile 11 | restart: 12 | always 13 | ports: 14 | - "3306:3306" 15 | 16 | hive: 17 | image : hiveimage 18 | container_name: hive 19 | build: 20 | context: ./FakeHiveServer/aspnetapp 21 | dockerfile: Dockerfile 22 | restart: 23 | always 24 | ports: 25 | - "11501:11501" 26 | depends_on: 27 | - db 28 | - redis 29 | 30 | server: 31 | image : serverimage 32 | container_name: server 33 | build: 34 | context: ./APIServer/aspnetapp 35 | dockerfile: Dockerfile 36 | restart: 37 | always 38 | ports: 39 | - "11500:11500" 40 | depends_on: 41 | - db 42 | 43 | redis: 44 | image: redis 45 | container_name: redis 46 | restart: 47 | always 48 | ports: 49 | - "6379:6379" -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthClient/Defines.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthClient/Defines.h -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthClient/MixedLengthClient.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthClient/MixedLengthClient.h -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthClient/MixedLengthClient.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MixedLengthClient", "MixedLengthClient.vcxproj", "{9D449647-095B-94DD-52D2-1FFFBE276565}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {9D449647-095B-94DD-52D2-1FFFBE276565}.Debug|x64.ActiveCfg = Debug|x64 13 | {9D449647-095B-94DD-52D2-1FFFBE276565}.Debug|x64.Build.0 = Debug|x64 14 | {9D449647-095B-94DD-52D2-1FFFBE276565}.Release|x64.ActiveCfg = Release|x64 15 | {9D449647-095B-94DD-52D2-1FFFBE276565}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthClient/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthClient/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthServer/Defines.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthServer/Defines.h -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthServer/MixedLengthServer.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthServer/MixedLengthServer.h -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthServer/MixedLengthServer.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MixedLengthServer", "MixedLengthServer.vcxproj", "{B5596F6C-2170-6D02-6AE7-F823D63C3E8A}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {B5596F6C-2170-6D02-6AE7-F823D63C3E8A}.Debug|x64.ActiveCfg = Debug|x64 13 | {B5596F6C-2170-6D02-6AE7-F823D63C3E8A}.Debug|x64.Build.0 = Debug|x64 14 | {B5596F6C-2170-6D02-6AE7-F823D63C3E8A}.Release|x64.ActiveCfg = Release|x64 15 | {B5596F6C-2170-6D02-6AE7-F823D63C3E8A}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthServer/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_MixedLengthServer/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_01/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_01/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_01/tcp_client_01.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcp_client_01", "tcp_client_01.vcxproj", "{AA1ACD68-16DB-489F-DF15-921C4B958D7B}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {AA1ACD68-16DB-489F-DF15-921C4B958D7B}.Debug|x64.ActiveCfg = Debug|x64 13 | {AA1ACD68-16DB-489F-DF15-921C4B958D7B}.Debug|x64.Build.0 = Debug|x64 14 | {AA1ACD68-16DB-489F-DF15-921C4B958D7B}.Release|x64.ActiveCfg = Release|x64 15 | {AA1ACD68-16DB-489F-DF15-921C4B958D7B}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_02/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_02/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_02/tcp_client_02.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcp_client_02", "tcp_client_02.vcxproj", "{AB1ACD68-17DB-489F-E015-921C4C958D7B}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Debug|x64.ActiveCfg = Debug|x64 13 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Debug|x64.Build.0 = Debug|x64 14 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Release|x64.ActiveCfg = Release|x64 15 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_03/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_03/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_client_03/tcp_client_03.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcp_client_03", "tcp_client_03.vcxproj", "{AB1ACD68-17DB-489F-E015-921C4C958D7B}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Debug|x64.ActiveCfg = Debug|x64 13 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Debug|x64.Build.0 = Debug|x64 14 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Release|x64.ActiveCfg = Release|x64 15 | {AB1ACD68-17DB-489F-E015-921C4C958D7B}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_01/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_01/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_01/tcp_server_01.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcp_server_01", "tcp_server_01.vcxproj", "{2CDCB30D-98F0-DBBE-6172-7F1ECD45D8EF}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {2CDCB30D-98F0-DBBE-6172-7F1ECD45D8EF}.Debug|x64.ActiveCfg = Debug|x64 13 | {2CDCB30D-98F0-DBBE-6172-7F1ECD45D8EF}.Debug|x64.Build.0 = Debug|x64 14 | {2CDCB30D-98F0-DBBE-6172-7F1ECD45D8EF}.Release|x64.ActiveCfg = Release|x64 15 | {2CDCB30D-98F0-DBBE-6172-7F1ECD45D8EF}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_02/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_02/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_02/tcp_server_02.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcp_server_02", "tcp_server_02.vcxproj", "{C3389716-2FF9-124D-F833-5CCA64B35729}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Debug|x64.ActiveCfg = Debug|x64 13 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Debug|x64.Build.0 = Debug|x64 14 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Release|x64.ActiveCfg = Release|x64 15 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_03/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_03/main.cpp -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/codes/tcp_server_03/tcp_server_03.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcp_server_03", "tcp_server_03.vcxproj", "{C3389716-2FF9-124D-F833-5CCA64B35729}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|x64 = Debug|x64 9 | Release|x64 = Release|x64 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Debug|x64.ActiveCfg = Debug|x64 13 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Debug|x64.Build.0 = Debug|x64 14 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Release|x64.ActiveCfg = Release|x64 15 | {C3389716-2FF9-124D-F833-5CCA64B35729}.Release|x64.Build.0 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/002.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/003.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/004.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/005.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/006.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/007.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/008.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/009.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/010.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/011.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/012.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/013.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/014.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/015.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/016.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/017.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/018.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/018.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/019.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/020.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/021.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/022.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/023.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/024.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/025.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/026.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/027.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/027.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/028.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/029.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/030.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/031.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/032.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/033.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/034.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/035.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/035.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/036.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/036.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/037.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/038.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/038.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/039.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/039.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/040.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/041.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/041.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/042.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/042.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/043.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/044.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/045.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/046.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/046.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/047.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/047.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/048.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/049.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/049.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/050.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/050.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/051.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/051.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/052.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/052.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/053.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/054.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/054.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/055.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/055.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/056.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/056.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/057.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/057.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/058.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/058.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/059.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/059.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/201.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/202.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/202.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/203.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/204.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/204.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/205.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/205.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/206.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/206.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/207.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/207.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/208.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/208.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/209.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_TCPIP_Windows_소켓_프로그래밍/images/209.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/001.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/002.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/003.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/004.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/005.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/006.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/007.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/008.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/009.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/010.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/011.png -------------------------------------------------------------------------------- /docs/게임_서버_개발자_알아야할_네트워크_이론/images/012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/docs/게임_서버_개발자_알아야할_네트워크_이론/images/012.png -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/CppUnitTest.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.30110.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CppUnitTest", "CppUnitTest.vcxproj", "{722C192D-61BF-48A6-90AB-35870C0BAD0A}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Release|Win32 = Release|Win32 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {722C192D-61BF-48A6-90AB-35870C0BAD0A}.Debug|Win32.ActiveCfg = Debug|Win32 15 | {722C192D-61BF-48A6-90AB-35870C0BAD0A}.Debug|Win32.Build.0 = Debug|Win32 16 | {722C192D-61BF-48A6-90AB-35870C0BAD0A}.Release|Win32.ActiveCfg = Release|Win32 17 | {722C192D-61BF-48A6-90AB-35870C0BAD0A}.Release|Win32.Build.0 = Release|Win32 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/CppUnitTest.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/SampleEnDecoder.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/SampleEnDecoder.h -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/UnitTest_EnDecode.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/UnitTest_EnDecode.cpp -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/stdafx.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/stdafx.cpp -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/stdafx.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/stdafx.h -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/targetver.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/CppUnitTest/targetver.h -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/UnitTestProject/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다. 6 | // 어셈블리와 관련된 정보를 수정하려면 7 | // 이 특성 값을 변경하십시오. 8 | [assembly: AssemblyTitle("UnitTestProject")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("UnitTestProject")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 18 | // 노출되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 19 | // 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오. 20 | [assembly: ComVisible(false)] 21 | 22 | // 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. 23 | [assembly: Guid("47586208-f558-45a6-84ec-403639573d19")] 24 | 25 | // 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. 26 | // 27 | // 주 버전 28 | // 부 버전 29 | // 빌드 번호 30 | // 수정 버전 31 | // 32 | // 모든 값을 지정하거나 아래와 같이 빌드 번호 및 수정 버전이 자동으로 33 | // 지정되도록 할 수 있습니다. 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/GeneratorCodeUnitTest/UnitTestProject/SamplePacket.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace UnitTestProject 8 | { 9 | public class PKTReqLogin 10 | { 11 | public short IDLength; 12 | public string ID; 13 | public short PWLength; 14 | public string PW; 15 | } 16 | 17 | public class PKTArrayTest1 18 | { 19 | public short Count; 20 | public List ValueList = new List(); 21 | } 22 | 23 | public class CharItem 24 | { 25 | public int ItemCode; 26 | public int Level; 27 | public float Exp; 28 | } 29 | public class PKTArrayTest2 30 | { 31 | public short Count; 32 | public List ItemList = new List(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/PacketBinaryEnCodingGenerator/PacketBinaryEnCodingGenerator.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | 10 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/PacketBinaryEnCodingGenerator/PacketBinaryEnCodingGenerator.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.28729.10 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PacketBinaryEnCodingGenerator", "PacketBinaryEnCodingGenerator.csproj", "{F4D41528-9008-4568-B0A8-BA3E7938483E}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {F4D41528-9008-4568-B0A8-BA3E7938483E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {F4D41528-9008-4568-B0A8-BA3E7938483E}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {F4D41528-9008-4568-B0A8-BA3E7938483E}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {F4D41528-9008-4568-B0A8-BA3E7938483E}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {1D39F17B-095B-406C-B692-ADC0D56FC29F} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/README.md: -------------------------------------------------------------------------------- 1 | # MyStringParsePacketGenerator 2 | C#으로 만든 패킷 인코딩/디코딩 코드 생성기. C++ -> C#, C# -> C++ 3 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/ConsoleApp/ConsoleApp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | netcoreapp2.2 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/ConsoleApp/ConsoleApp.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.28729.10 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp", "ConsoleApp.csproj", "{7D8EA4F4-C565-4523-8A0E-DF9303DC9D40}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PacketBinaryEnCodingGenerator", "..\..\PacketBinaryEnCodingGenerator\PacketBinaryEnCodingGenerator.csproj", "{0644B572-74C9-4560-A67C-D76591CD8F15}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {7D8EA4F4-C565-4523-8A0E-DF9303DC9D40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {7D8EA4F4-C565-4523-8A0E-DF9303DC9D40}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {7D8EA4F4-C565-4523-8A0E-DF9303DC9D40}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {7D8EA4F4-C565-4523-8A0E-DF9303DC9D40}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {0644B572-74C9-4560-A67C-D76591CD8F15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {0644B572-74C9-4560-A67C-D76591CD8F15}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {0644B572-74C9-4560-A67C-D76591CD8F15}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {0644B572-74C9-4560-A67C-D76591CD8F15}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {12F792E3-0283-45C3-A598-5515DB7ABD69} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/TestApp/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/TestApp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace PacketEnDeCodeGeneratorForm 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// 해당 응용 프로그램의 주 진입점입니다. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new MainForm()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/TestApp/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다. 6 | // 어셈블리와 관련된 정보를 수정하려면 7 | // 이 특성 값을 변경하십시오. 8 | [assembly: AssemblyTitle("PacketEnDeCodeGeneratorForm")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("PacketEnDeCodeGeneratorForm")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 18 | // 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 19 | // 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오. 20 | [assembly: ComVisible(false)] 21 | 22 | // 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. 23 | [assembly: Guid("1c4747a1-07ba-493a-a2f2-daa76ecb7f5f")] 24 | 25 | // 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. 26 | // 27 | // 주 버전 28 | // 부 버전 29 | // 빌드 번호 30 | // 수정 버전 31 | // 32 | // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 버전이 자동으로 33 | // 지정되도록 할 수 있습니다. 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/TestApp/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 이 코드는 도구를 사용하여 생성되었습니다. 4 | // 런타임 버전:4.0.30319.42000 5 | // 6 | // 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 7 | // 이러한 변경 내용이 손실됩니다. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace TestApp.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/TestApp/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/TestApp/TestApp.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.28729.10 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp.csproj", "{718F3559-9021-40B0-9DF1-00DD4C80C85D}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PacketBinaryEnCodingGenerator", "..\..\PacketBinaryEnCodingGenerator\PacketBinaryEnCodingGenerator.csproj", "{A719446E-3BDC-4D9C-86D5-526B2F4675FE}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {718F3559-9021-40B0-9DF1-00DD4C80C85D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {718F3559-9021-40B0-9DF1-00DD4C80C85D}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {718F3559-9021-40B0-9DF1-00DD4C80C85D}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {718F3559-9021-40B0-9DF1-00DD4C80C85D}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {A719446E-3BDC-4D9C-86D5-526B2F4675FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {A719446E-3BDC-4D9C-86D5-526B2F4675FE}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {A719446E-3BDC-4D9C-86D5-526B2F4675FE}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {A719446E-3BDC-4D9C-86D5-526B2F4675FE}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {B9D1180B-6DB5-474F-93BE-10DB91B0CF8D} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/WinFormApp/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/WinFormApp/GuiApp.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.28729.10 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GuiApp", "GuiApp.csproj", "{30AF7F91-21B6-422B-BFFC-4B8CB5C39FFB}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PacketBinaryEnCodingGenerator", "..\..\PacketBinaryEnCodingGenerator\PacketBinaryEnCodingGenerator.csproj", "{A3FD1E9F-9092-4959-972E-B7F8837E66FB}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {30AF7F91-21B6-422B-BFFC-4B8CB5C39FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {30AF7F91-21B6-422B-BFFC-4B8CB5C39FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {30AF7F91-21B6-422B-BFFC-4B8CB5C39FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {30AF7F91-21B6-422B-BFFC-4B8CB5C39FFB}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {A3FD1E9F-9092-4959-972E-B7F8837E66FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {A3FD1E9F-9092-4959-972E-B7F8837E66FB}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {A3FD1E9F-9092-4959-972E-B7F8837E66FB}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {A3FD1E9F-9092-4959-972E-B7F8837E66FB}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {7F82EB33-A138-4847-AA10-B06D16E56812} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/WinFormApp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace PacketEnDeCodeGeneratorWinForm 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// 해당 응용 프로그램의 주 진입점입니다. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new MainForm()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/WinFormApp/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다. 6 | // 어셈블리와 관련된 정보를 수정하려면 7 | // 이 특성 값을 변경하십시오. 8 | [assembly: AssemblyTitle("PacketEnDeCodeGeneratorWinForm")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("PacketEnDeCodeGeneratorWinForm")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 18 | // 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 19 | // 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오. 20 | [assembly: ComVisible(false)] 21 | 22 | // 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다. 23 | [assembly: Guid("2e5224dc-420b-4478-b0a4-5042395a77c9")] 24 | 25 | // 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. 26 | // 27 | // 주 버전 28 | // 부 버전 29 | // 빌드 번호 30 | // 수정 버전 31 | // 32 | // 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 버전이 자동으로 33 | // 지정되도록 할 수 있습니다. 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/WinFormApp/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 이 코드는 도구를 사용하여 생성되었습니다. 4 | // 런타임 버전:4.0.30319.42000 5 | // 6 | // 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 7 | // 이러한 변경 내용이 손실됩니다. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace GuiApp.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /hands-on/CodeGeneratorStringParsePacket/Samples/WinFormApp/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /hands-on/README.md: -------------------------------------------------------------------------------- 1 | # 프로그래밍 실습 2 | 3 | ## CodeGeneratorStringParsePacket 4 | 구조체(혹은 클래스)를 바이너리로 직렬화 하는 코드는 C# or C++로 만들면 이 파일을 읽어서 C++ por C# 으로 코드를 변환하는 툴이다. 5 | 서버나 클라이언트 한쪽이 C++, C# 인 경우 하나의 언어로만 패킷 직렬화 코드를 만들면 다른 프로그래밍 언어의 코드로 변환하여 만들어준다. 6 | 7 | 아직 완전 완성이 아니니 기능 추가 등을 하면서 완성해 본다. 8 | -------------------------------------------------------------------------------- /monogame/Project1/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-mgcb": { 6 | "version": "3.8.1.303", 7 | "commands": [ 8 | "mgcb" 9 | ] 10 | }, 11 | "dotnet-mgcb-editor": { 12 | "version": "3.8.1.303", 13 | "commands": [ 14 | "mgcb-editor" 15 | ] 16 | }, 17 | "dotnet-mgcb-editor-linux": { 18 | "version": "3.8.1.303", 19 | "commands": [ 20 | "mgcb-editor-linux" 21 | ] 22 | }, 23 | "dotnet-mgcb-editor-windows": { 24 | "version": "3.8.1.303", 25 | "commands": [ 26 | "mgcb-editor-windows" 27 | ] 28 | }, 29 | "dotnet-mgcb-editor-mac": { 30 | "version": "3.8.1.303", 31 | "commands": [ 32 | "mgcb-editor-mac" 33 | ] 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /monogame/Project1/Content/Content.mgcb: -------------------------------------------------------------------------------- 1 | 2 | #----------------------------- Global Properties ----------------------------# 3 | 4 | /outputDir:bin/$(Platform) 5 | /intermediateDir:obj/$(Platform) 6 | /platform:Windows 7 | /config: 8 | /profile:Reach 9 | /compress:False 10 | 11 | #-------------------------------- References --------------------------------# 12 | 13 | 14 | #---------------------------------- Content ---------------------------------# 15 | 16 | -------------------------------------------------------------------------------- /monogame/Project1/Game1.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Xna.Framework; 2 | using Microsoft.Xna.Framework.Graphics; 3 | using Microsoft.Xna.Framework.Input; 4 | 5 | namespace Project1 6 | { 7 | public class Game1 : Game 8 | { 9 | private GraphicsDeviceManager _graphics; 10 | private SpriteBatch _spriteBatch; 11 | 12 | public Game1() 13 | { 14 | _graphics = new GraphicsDeviceManager(this); 15 | Content.RootDirectory = "Content"; 16 | IsMouseVisible = true; 17 | } 18 | 19 | protected override void Initialize() 20 | { 21 | // TODO: Add your initialization logic here 22 | 23 | base.Initialize(); 24 | } 25 | 26 | protected override void LoadContent() 27 | { 28 | _spriteBatch = new SpriteBatch(GraphicsDevice); 29 | 30 | // TODO: use this.Content to load your game content here 31 | } 32 | 33 | protected override void Update(GameTime gameTime) 34 | { 35 | if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) 36 | Exit(); 37 | 38 | // TODO: Add your update logic here 39 | 40 | base.Update(gameTime); 41 | } 42 | 43 | protected override void Draw(GameTime gameTime) 44 | { 45 | GraphicsDevice.Clear(Color.CornflowerBlue); 46 | 47 | // TODO: Add your drawing code here 48 | 49 | base.Draw(gameTime); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /monogame/Project1/Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacking75/NewbieGameServerProgrammerLearningMaterials/83446bf9e65dd1753e311116705ffa5e14dee25e/monogame/Project1/Icon.ico -------------------------------------------------------------------------------- /monogame/Project1/Program.cs: -------------------------------------------------------------------------------- 1 |  2 | using var game = new Project1.Game1(); 3 | game.Run(); 4 | -------------------------------------------------------------------------------- /monogame/Project1/Project1.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | WinExe 4 | net6.0-windows 5 | Major 6 | false 7 | false 8 | true 9 | 10 | 11 | app.manifest 12 | Icon.ico 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /monogame/Project1/Project1.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.10.34916.146 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Project1", "Project1.csproj", "{8EFF1171-A3C4-4371-A61D-71FA94784A78}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {8EFF1171-A3C4-4371-A61D-71FA94784A78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {8EFF1171-A3C4-4371-A61D-71FA94784A78}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {8EFF1171-A3C4-4371-A61D-71FA94784A78}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {8EFF1171-A3C4-4371-A61D-71FA94784A78}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {7091084A-F139-465E-B1DC-88F3131A423B} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /monogame/Project1/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | true/pm 39 | permonitorv2,permonitor 40 | 41 | 42 | 43 | 44 | --------------------------------------------------------------------------------