[C# 서버] 소켓 서버 문서
·
server/socket server
C# 기반으로 제작한 소켓 서버의 문서입니다. 이 서버는 Unity 엔진을 위해 제작되었으며, 온라인 게임을 포함하여 시뮬레이션, 하드웨어 제어 등 다양한 분야에서 사용될 수 있습니다. HTML 삽입 미리보기할 수 없는 소스
[Socket + MySql] 비동기 쿼리 사용 This MySqlConnection is already in use.
·
server/socket server
클라이언트 서버 DB 관계에서는 비동기 쿼리 호출응답을 사용하여야 하는데, 멀티쓰레드 환경에서 오류가 발생하였고, 이를 해결하여 정리해봤습니다. 📺 오류 This MySqlConnection is already in use. 오류가 나오며 현재 이 Connection이 사용중이라고 나옵니다. 💬 오류 스크립트 using MySqlConnector; using Server.Game; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; /// /// MySQL 쿼리 매니저 /..
[C# 서버] RSA(공개키) 방식으로 통신
·
server/socket server
서버와 클라이언트 간 통신에서 비밀번호와 같은 민감한 정보를 공개키 방식으로 통신하는 이유는 보안과 개인 정보 보호를 강화하기 위해서입니다. 공개키 암호화는 대칭키 암호화에 비해 추가적인 보안 기능을 제공합니다. 💬 시작하기 앞서... 본 글은 소켓 서버 자체 구축 중 로그인 기능을 구현하기위해 서버로 비밀번호를 요청할 때 비밀번호를 평문으로 보내면 유출가능성이 있어 이를 해결하기위한 공개키 암호화 방식을 사용하는 방법을 구현하고 정리한 글 입니다. 💬 서론 공개키 암호화 방식은 공개키와 개인키라는 두 개의 키를 사용합니다. 공개키는 모든 사람에게 공개되어 있으며, 개인키는 키 소유자에게만 비밀로 유지됩니다. 이 방식은 다음과 같은 장점을 가지고 있습니다. 기밀성: 공개키로 암호화된 정보는 개인키로만 해..
[구글 프로토콜 버퍼] 패킷 한글 주석 인코딩 해결
·
server/socket server
PROTOBUF를 이용하여 패킷을 생성할 때 한글주석 인코딩이 깨지는 문제가 발생하여 개발에 불편함을 줘 이를 해결하는 방법을 찾아 해결하고 정리하였습니다. 💬 문제점 위와같이 주석 인코딩이 깨져 알 수 없는 문자로 나타나는 것을 볼 수 있습니다. 인코딩 문제는 UTF-8로 인코딩을 바꿔 어렵지 않게 해결할 수 있습니다. 📖 해결 방법 *.proto 파일의 확장자를 txt로 바꿔줍니다. txt로 바꾼 파일을 메모장으로 열고 다른 이름으로 저장을 클릭합니다. 파일명과 이름을 그대로 둔 채 인코딩을 UTF-8로 선택하고 저장합니다. txt 확장자를 다시. proto로 바꿔줍니다. proto 파일을 기반으로 패킷을 생성합니다. 한글로 정상적으로 패킷의 주석이 나오는것을 볼 수 있습니다. 🕹️ Unity Aff..
[C# 서버] Async Session, Event
·
server/socket server
📄 Async Session 지난 글과 작동은 같지만, 버퍼를 성공적으로 송신하거나, 수신할 때를 다룹니다. 더욱 효율적인 송신 방법과 각 이벤트가 성공적으로 수행되면 Event를 통해 확인할 수 있도록 학습하였습니다. 📑 Session using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace ServerCore { public abstract class Session { Socket mSocket; int mIsDisconnected = 0; //현재 Disc..
[C# 서버] Async Listener
·
server/socket server
📄 비동기 리스너 지난 글[네트워크 서버 구축(C#) 12.소켓 프로그래밍]에서 간단한 소켓 통신을 하는 프로그램을 작성하였습니다. 하지만 작성했던 프로그램은 동기성 프로그램으로, 블로킹방식을 사용하기때문에 서버나 클라이언트에서 소켓을 받을때까지 기다려야 합니다. 직관적이고 간단하다는 장점이 있지만, 적합한 모델은 아니기때문에 비동기 방식의 리스너를 공부하여 이를 정리했습니다. 📑 Listener using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace Serv..
[C# 서버] 소켓 프로그래밍
·
server/socket server
📄 소켓 프로그래밍 지금까지 네트워크의 기본적인 이론을 다뤘다면, 이제부터 클라이언트와 서버 간 통신을 위한 프로그램을 작성해보도록 하겠습니다. 📑 Server using System.Net; using System.Net.Sockets; using System.Text; namespace ServerCore { class Program { private static void Main(string[] args) { //DNS 사용 string host = Dns.GetHostName(); //현재 로컬의 호스트를 가져옴 IPHostEntry ipHost = Dns.GetHostEntry(host); IPAddress ipAddress = ipHost.AddressList[0]; //배열로 들어있는 값 중..
[C# 서버] Thread Local Storage
·
server/socket server
📄 TLS TLS(스레드 로컬 스토리지)는 스레드에 로컬인 정적 또는 전역 메모리를 사용하는 컴퓨터 프로그래밍 방법입니다. 이 기능은 정적, 전역변수를 각 스레드에게 독립적인 형태로 만들어주고싶을때 사용할 수 있습니다. 📑 정적 변수 namespace ServerCore { class Program { static string ThreadName; static void WhoAmI() { ThreadName = $"My Name Is {Thread.CurrentThread.ManagedThreadId}"; Thread.Sleep(1000); Console.WriteLine(ThreadName); } private static void Main(string[] args) { //Invoke에 넣는 액션만큼..
[C# 서버] ReaderWriterLock 구현
·
server/socket server
📄 ReaderWriterLock ReaderWriterLock은 이전 글[유니티 서버 구축(C#) 9.ReaderWriterLock]에서 다뤘습니다. 상호배제를 위한 기능은 동일하지만, 데이터에 대해 읽기, 쓰기에 대한 호출의 비율이 매우 편중되어있을 때 적합한 방법입니다. 📑 Lock.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerCore { //재귀적 락을 허용하지 않는 모델 class Lock { //음수가 될 수 있기에 최상위비트 사용하지 않음 const int EMPTY_FLAG = 0x00000000..
[C# 서버] ReaderWriterLock
·
server/socket server
📄 ReaderWriterLock 상호배제를 위한 기능은 동일하지만, 데이터에 대해 읽기, 쓰기에 대한 호출의 비율이 매우 편중되어있을 때 적합한 방법입니다. 예를들어 플레이어들이 서버로부터 아이템을 보상을 받는다고 할때 플레이어는 단순히 서버로부터 획득할 아이템 정보를 읽으면 됩니다. 읽는것만으로는 큰 문제가 되지 않습니다. 이 상태에 일반적인 Lock을하여 읽는것에대해 상호배제를 적용한다면 아쉬운 성능을 보여줄 수 있습니다. 서버 관리자가 가끔씩 보상 아이템을 설정하기위해 쓰기를 하는 경우를 들었을때 플레이어들이 읽는것에 비해 빈도가 아주 적게 일어나 아주 가끔씩 Lock을해야하는 경우 이 방법을 사용하면 더욱 효과적입니다. 📑 ReaderWriterLockSlim namespace ServerCor..
[C# 서버] Mutex
·
server/socket server
📄 Mutex Mutex는 AutoResetEvent와 비슷하게 상호배제를 위한 기능으로 사용할 수 있습니다. AutoResetEvent와 다르게 더 많은 정보를 내부에 지니고 있으며 예로 다중Lock을 하여 몇번 Lock을 했는지, 스레드ID를 가지고있어 자신을 Lock시킨 스레드를 알고, 추후에 다른 스레드에서 자신을 Release했는지 확인하여 잘못된 코드를 확인할 수 있는 기능을 지닙니다. 하지만 더 많은 정보를 가지고 있기에 보다 느리게 동작합니다. 📑 Mutex namespace ServerCore { class Program { static int number = 0; static Mutex _lock = new Mutex(); static void Thread1() { for(int i =..
[C# 서버] AutoResetEvent
·
server/socket server
📄 AutoResetEvent SpinLock에서 스레드는 언락 된 상태를 확인할 때까지 계속 반복하여 체크를 해야 했습니다. 하지만 이것은 자원을 낭비하는 것으로 적합하지 못할 수 있습니다. C#에서 제공하는 AutoResetEvent는 while(true){}처럼 무한루프를 돌지 않고, 커널에 요청을 하여 "내가 접근할 수 있을 때 알려줘"라는 요청을 할 수 있습니다. 이것은 매우 간편하게 사용할 수 있지만, 커널에 접근하여 수행을 하기에 매우 느리다는 단점이 있습니다. 📑 AutoResetEvent namespace ServerCore { class Lock { //boolean 변수 같은 개념 //Auto: 자동으로 문을 닫아주는 기능을 포함 AutoResetEvent _available = ne..
[C# 서버] Context Switching
·
server/socket server
📄 Context Switching 이전 글에서 스핀락에서는 스레드가 락 획득을 위해 while() 문에서 획득하기 전까지 무한반복하여 획득을 얻고자 한다는것을 다뤘습니다. 하지만 획득을 위한 무한루프는 큰 낭비이며, 이것을 개선하고자 다른 스레드에게 자원을 나눠줄 수 있습니다. 비슷한 세가지의 방법을 다루며, 스레드의 작업을 쉬고, 다른 스레드에게 남은 자원을 할당하여 작업하게 하는것을 Context Switching이라고 합니다. Context Switching은 무한반복하여 획득을 얻고자하는 스레드가 있을때, 다른 스레드가 작업을 할 수 있도록 하는 장점을 가지고 있지만, Context Switching을 하기위한 작업이 적은 비용이 아니기때문에 이러한 문제를 충분히 고려해야합니다. 무조건적으로 다..
[C# 서버] 스핀락
·
server/socket server
📄 스핀락 스핀락은 잠금을 획득하려는 스레드가 특정 코드가 현재 사용 가능한지 반복적으로 확인하면서 단순히 루프('스핀')에서 기다리는 것입니다. 스레드는 활성 상태를 유지하지만 계속 락에 대한 검사를 수행하는 형태를 띱니다. 장점: spinning 중이고 스레드가 휴지 상태가 아니기 때문에 콘텍스트 전환이 필요하지 않습니다. 크리티컬 섹션(스레드가 동시에 접근해서는 안 되는 공유 자원을 접근하는 코드)이 작으면 도움이 됩니다. 단점: Spinlock은 spinning이 필요합니다. 락 상태에서 사용할 수 없으면 액세스 가능한지 반복적으로 확인합니다.(CPU를 낭비) 📑 SpinLock 이론 namespace ServerCore { class SpinLock { private volatile bool m..
[C# 서버] 원자성, Interlocked, Monitor, lock
·
server/socket server
📄 원자성 스레드 환경에서 원자성이란, 간단히 말해 어떠한 계산을 수행할 때 한번에 끝난다(한 줄에 끝난다)라고 표현할 수 있습니다. 계산을 위한 연산이 여러단계에 걸치면, 여러 스레드에서 공유변수에대해 서로 참조를하다보면 어긋날 수 있는 문제(경합조건)가 발생할 수 있습니다. 📑 예제 namespace ServerCore { class Program { static int number = 0; static void Thread1() { for (int i = 0; i < 10000000; ++i) { number++; //int temp = number; //temp += 1; //number = temp; } } static void Thread2() { for (int i = 0; i < 10000..
[C# 서버] 메모리 배리어
·
server/socket server
📄 메모리 배리어 메모리 배리어는 [코드 재배치 억제] 캐시에 의한 재배치, CPU 파이프라인에 의한 코드 재배치에 의해 멀티스레드환경에서 의도하지 않은 연산 결과를 억제할 수 있습니다. [가시성 보장] 또한 특정 스레드에서 공유 메모리 자원에 대한 값을 변경하고, 다른 스레드가 같은 공유 메모리에 접근할 때, 특정스레드가 변경해놓은 값을 읽어올 수 있도록 합니다. 📑 예제 namespace ServerCore { class Program { static int x = 0; static int y = 0; static int r1 = 0; static int r2 = 0; static void Thread1() { y = 1; //Store y //Thread.MemoryBarrier(); r1 = x;..
[C# 서버] volatile
·
server/socket server
📄 volatile volatile 변수 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. C/C++ 프로그래밍 언어에서 이 키워드는 최적화 등 컴파일러의 재량을 제한하는 역할을 한다. 개발자가 설정한 개념을 구현하기 위해 코딩된 프로그램을 온전히 ko.wikipedia.org 최적화 등 컴파일러의 재량을 제한하는 역할을 한다. 개발자가 설정한 개념을 구현하기 위해 코딩된 프로그램을 온전히 컴파일되도록 한다. 주로 최적화와 관련하여 volatile가 선언된 변수는 최적화에서 제외된다. volatile는 멀티스레드 환경에서 컴파일러의 최적화로 인해 개발자가 의도한 코드가 바뀌어 비 정상적으로 작동하는것을 방지하기위해 해당 변수에 컴파일러 최적화를 제한(제외)하는 키워드입니다. 디버그 환..
[C# 서버] 멀티스레드(Multi-thread) 기초
·
server/socket server
📄 멀티스레드 멀티스레드, 코어에서 여러 개의 스레드를 효과적으로 실행할 수 있는 하드웨어 지원을 갖추고 있는 장점을 활용하여 한번에 여러 개의 작업을 동시에 호출하여 실행하도록 하는 것입니다. 📑 Thread namespace ServerCore { class Program { static void SubThread() { for (int i = 0; i < 10; ++i) { Console.WriteLine("서브 스레드"); } } static void Main(string[] args) { Thread subthread = new Thread(SubThread); //스레드 생성 subthread.Name = "서브스레드"; //스레드의 이름을 설정 subthread.IsBackground = t..
bonnate
'server/socket server' 카테고리의 글 목록