C# 27

[c#][서버] RecvBuffer, SendBuffer

TCP 패킷 조립 - RecvBufferTCP의 특성상, 흐름제어로 인해 패킷이 분리되어 도착할 수 있음그러므로 패킷이 나뉘어 왔을 때 전부 올 때까지 대기하다가 조립하는 동작을 추가해주자readPos처리할지 말지 결정하는 커서 writePos가 패킷의 끝까지 왔다면 read아니라면 대기writePos지금까지 받은 바이트 커서마지막 바이트 뒤에 위치버퍼 공간이 부족해지면?read와 write를 앞으로 보낼 수 있을 만큼 보냄항상 read 현재 wirte - read 만큼의 공간은 유지해야 함public class RecvBuffer{ ArraySegment _buffer; int _readPos; int _writePos; public RecvBuffer(int bufferSize)..

C#/네트워크 2024.06.07

[c#][서버] TCP vs UDP

게임 서버에서 예시이동 패킷 ((3, 2) 좌표로 이동하고 싶다)(15 3 2) 라고 패킷이 이루어 진다고 가정15, 3, 2가 모두 손실없이 서버에 전달되어야 온전히 실행될 것TCP의 경우, 패킷이 100바이트 일때, 이게 온전히 전달된다는 보장이 없음서버에 혼잡이 너무 심해 일부분만 보내거나 할 수 있음(흐름제어)TCP vs UDPTCP와 UDP의 차이TCP / 안전한 트럭, 전화 연결 방식연결형 서비스연결을 위해 할당되는 논리적 경로가 있음전송 순서가 보장 O신뢰성 Good, 속도 Bad분실이 일어나면 책임지고 다시 전송물건을 주고 받을 상황이 아니면 일부만 보냄(흐름, 혼잡 제어)고려할 것이 많으니 속도가 느림UDP / 위험한 퀵서비스, 우편 전송 방식(순서가 뒤바뀔 수 있는)비연결형 서비스연결이..

C#/네트워크 2024.06.07

[c#][서버] Listener

주의할 점소켓 통신에서, accept, receive, send같은 입출력 계열의 함수는 비동기, 논블로킹 계열 함수로 만들어야 함비동기 -> Accept 분리하기Accept 요청과 완료를 분리하여 구현해야 함using System.Net;using System.Net.Sockets;using System.Text;class Listener{ Socket _listenSocket; Action _onAcceptHandler; public void Init(IPEndPoint endPoint, Action onAcceptHandler) { _listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, Proto..

C#/네트워크 2024.06.05

[c#][서버] 소켓 프로그래밍

소켓 통신의 개념 흐름고오급 식당입구마련, 문지기 고용문자기 교육식당 이름, 연락처, 입구의 정보가게 폰 하나 쥐어주고 대기시킴식당 오픈손님 입장식당에 연락해둠문지기는 대리인을 앉히고, 손님과 연락하게 함실제 컴퓨터손님소켓 준비서버 주소로 Connect소켓을 통해 Session 소켓과 패킷 송수신 가능식당Listener 소켓 준비Bind(서버 주소 / Port를 소켓에 연동)ListenAccept클라이언트 세션을 통해 손님과 통신구현서버 측using System.Net;using System.Net.Sockets;using System.Text;namespace ServerCore{ class Program { static void Main(string[] args) ..

C#/네트워크 2024.06.05

[c#][서버] 네트워크 기초 이론

네트워크 이론이 중요한 이유다른 분야에 비해, 서버는 네트워크 지식이 없으면 보안이나 안정성 등 감도 못잡고 진행해야 함비유적 이론 설명물류 센터단지경비실집, 집, 집, 집위와 같은 구조가 있다고 가정같은 단지 내에서 택배를 보내는 경우경비실을 거쳐서 보낸다.주소와 물건을 함께 전달 공식 주소 대신 받는 사람의 닉네임을 줘도 됨이것은 같은 단지 주민들끼리 통용되는 닉네임다른 단지로 보내는 경우송신인 -> 경비실 -> 물류센터 -> 경비실 -> 수신인실제 컴퓨터집 = 단말(PC, 핸드폰)경비실 = 스위치물류센터 = 라우터단지 = 같은 네트워크 안(000.000.000.x) -> 0 부분이 단말끼리 같은스위치를 거친다면네트워크를 돌며 너가 x번 단말이니? 물어보고 맞으면 전달라우터를 거친다면외부 네트워크로 ..

C#/네트워크 2024.06.04

[c#][서버] Thread Local Storage

고오급 식당주문, 조리, 결제 등이 딱딱 아름답게 나뉘어 있지 않음반드시 왔다갔다 해야 함각 과정에 락을 다 걸어야 혼선이 생기지 않겠지?여러 직원이 한 테이블의 일에 몰리지 않게즉 게임으로 치면DB, 게임 로직, 클라이언트 세션, 로그 등멀티쓰레드로 얘네의 일감 분배를 아름답게 해줘야겠지무조건 멀티쓰레드라고 락 걸고 쓰레드를 늘리는게 능사가 아니다.좁은 공간에 여러 직원이 들어가 봤자 일하기 더 불편해질 뿐이다Thread Local StorageStack 영역은 각 쓰레드에 별도로 존재임시 메모리이므로 여기다가 무얼 저장한 다는 것은 불안정Heap, 데이터 영역은 모든 쓰레드가 공유여기에다가 각 쓰레드의 개인 공간을 만들어 준다면?이게 TLS의 개념static ThreadLocal ThreadName ..

C#/네트워크 2024.06.03

[c#][서버] ReaderWriterLock

C# 내장 SpinLockstatic object _lock = new object();static void Main(string[] args){ bool lockTaken = false; try { _lock2.Enter(ref lockTaken); } finally { if (lockTaken) _lock2.Exit(); }}//내부적으로 무한 뺑뺑이가 아닌, 너무 오래걸린다면 양보를 하도록 설계됨이전에 직접 구현해 본 spinlock은 c#에 자체적으로 위와 같이 존재함어떤 락이든, 기본 철학은 상호 배제ReaderWriterLock읽기는 락을 안걸고, 쓸 때만 락을 걸고 싶다면?즉, 평소에는 락이 필요 없는데 특수한 경우에만 락이 필요..

C#/네트워크 2024.06.03

[c#][서버] Lock 구현 이론

락 구현 개념화장실에 누군가가 문을 잠근 채로 있다면?그냥 기다린다.그런데 오랜 시간이 지나도 나오지 않는다면?조금 시간이 지난 뒤에 다시 온다.보장이 안되고 랜덤성이 강함다른 사람이 먼저 채갈수도줄서기 알바를 쓴다줄서고있는 알바가 화가 난다컴퓨터에서의 개념Spin Lock계속 뺑뺑이를 돌면서 대기계속 실행 상태로 있기 때문에 자원을 차지하고 있음CPU 점유율이 튄다Context Switching쓰레드가 소유권을 포기코어가 다른 쓰레드에게 가버린다일정 시간이 지난 후 다시 그 쓰레드로 복귀왔다갔다 하므로 오버헤드 부담이 있음Auto Reset Event이벤트를 통해 통보를 받음커널에다가 이벤트 발생을 명령깨어나는 시점이 다른 것 보단 정확함SpinLock 구현//락이 풀릴 때까지 대기class SpinL..

C#/네트워크 2024.06.02