분류 전체보기 67

[c#][서버] Unicode & Encoding / UTF8 vs UTF16

Ascii 코드1바이트로 문자를 표현ex) A = 0x41(65), ! = 0x21(33)UniCode다른 나라의 언어도 표현하기 위해 2바이트를 사용해 문자를 표현그럼에도 표현하지 못하는 문자는 3바이트를 사용ex) ㅎ = 0x001112, A = 0x000041Encoding가변적인 방법으로 컴퓨터에게 문자를 어떻게 매핑할지 결정하는 것매번 최대 바이트로 사용하면 낭비가 심하기 때문에 분류를 해둔 것UTF-8한글이 속한 분류영문은 1byte, 한글은 3byte로 사용UTF-16BMP까지는 2바이트(한글, 영문 모두), 다음은 4바이트BMP = 많이 쓰는 언어, 해당 범위를 넘어가면 음악기호같은 잘 안쓰는 부분대부분의 디폴트는 UTF16

C#/네트워크 2024.06.09

[c#][서버] PacketSession

패킷 조립그냥 byte 배열을 보내는 것이 아닌, Size, packetId등을 가진 패킷을 조립해서 넘겨보자namespace Server{ class Packet { //최대한 크기를 작게 보내자 public ushort size; //2 Byte public ushort packetId; } class GameSession : PacketSession { //OnRecv가 PacketSession에서 sealed가 됐으므로, 재정의 불가 //abstract OnRecvPacket을 정의하여 사용 public override void OnRecvPacket(ArraySegment buffer) ..

C#/네트워크 2024.06.07

[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