VisualStudio/C#서버 21

[C#서버] 실시간 서버 만드는 법 예제

지난 포스팅에서 패킷을 만들고, 클라이언트에서 패킷을 전송하는 것에 대해 살펴봤다. 이번에는 서버에서 그 패킷을 받아 응답하는 것을 하려고 한다. 2019/12/17 - [게임을 만들자/C# 서버] - c# 실시간 게임 서버 만들기 1 - 패킷 2019/12/19 - [게임을 만들자/C# 서버] - c# 실시간 게임 서버 만들기 2 - 클라이언트 1. 유저 접속 대기 서버 프로그램을 시작하면 우선적으로, 서버 소켓을 열고, 그 소켓에서 유저의 접속을 받는 것이다. 아래 코드에서 start함수부터 살펴 보면 된다. 유의할 점은, 유저 접속을 기다리는 부분이 메인 스레드가 아닌 서브 스레드에서 일어난 다는 것이다. '왜?'라는 생각이 들 수 있는데, 나는 [접속, 로직, db, http통신] 등에 대해서는 ..

[C#서버] 서버 개발 순서

DNS부터 SEND 블록킹 방식으로 작성 Listener생성 Accept 논블록킹 Session생성 Recv 논블록킹(SetBuffer 초기값 생성) Send 논블록킹 (sendqueue, pandinglist, lock) Disconnected작성 (Interlock) Session클래스 abstract class로 변경 Onsend, OnRecv, OnConnected, OnDisconnected 구현 Listener AcceptComp를 Func로 Session을 생성하게 수정 Connector생성 Connect논블로킹 RecvBuffer생성 SegmentBuffer, writPos, readPos, FreeSize, DataSize, ReadBuffer, WriteBuffer 구현 Session클..

[C#서버] 구글 프로토 버퍼(Google Protobuf C#)

구글 프로토버퍼란? Google Protocol Buffers(protobuf)는 데이터 직렬화 형식으로 사용되는 강력하고 효율적인 도구로, 다양한 언어와 플랫폼 간에 데이터를 교환하고 저장하기 위해 사용됩니다. protobuf의 주요 장점은 다음과 같습니다: 효율적인 직렬화: protobuf는 바이트 크기 측면에서 효율적입니다. 작은 크기의 직렬화된 데이터를 생성하며, 이는 데이터를 네트워크로 전송하거나 디스크에 저장할 때 대역폭과 저장 공간을 절약합니다. 빠른 역직렬화: protobuf 메시지는 효율적인 이진 형식으로 저장되므로 역직렬화 속도가 빠릅니다. 데이터를 직렬화된 형식에서 메모리 객체로 변환하는 작업이 빠르게 수행됩니다. 이식성: protobuf는 언어 중립적인 형식으로 데이터를 정의하며, ..

[C#서버] 빌드 경로 AppendTargetFrameworkToOutputPath

AppendTargetFrameworkToOutputPath AppendTargetFrameworkToOutputPath 속성은 TFM(대상 프레임워크 모니커)을 출력 경로(OutputPath에 정의)에 추가할지 여부를 제어합니다. .NET SDK는 대상 프레임워크와 런타임 식별자(있는 경우)를 출력 경로에 자동으로 추가합니다. AppendTargetFrameworkToOutputPath를 false로 설정하면 TFM이 출력 경로에 추가되지 않습니다. 그러나 출력 경로에 TFM이 없으면 여러 빌드 아티팩트가 서로 덮어쓸 수 있습니다. 예를 들어 .NET 5 앱에서 다음과 같이 설정하면 출력 경로가 bin\Debug\net5.0에서 bin\Debug로 변경됩니다. XML복사 false 출처 - https:..

[C#서비][방법] Packet자동화 xml파일 읽는 법

static void Main(string[] args) { XmlReaderSettings settings = new XmlReaderSettings() { IgnoreComments = true,//주석무시 IgnoreWhitespace = true//스페이스바 무시 }; using (XmlReader r = XmlReader.Create("PDL.xml", settings)) { r.MoveToContent();//xml에 존재하는 헤더를 건너 뛴다. while (r.Read()) { if (r.Depth == 1 && r.NodeType == XmlNodeType.Element)//XmlNodeType.Element은 xml의 처음 시작 변수의미 마지막 닫을 때는 필요 없기 때문. Console...

[C#서버][방법] BitConverter 사용법 - ArraySegment<byte>, Span, Slice

BitConverter BitConverter란 기본 데이터 형식을 바이트의 배열로, 바이트의 배열을 기본 데이터 형식으로 변환해주는 클래스이다. 배열에 데이터를 읽어온 후 배열에 담긴 데이터를 어떻게 기본 자료형으로 변환하는데 유용하다. Bitconverter.GetBytes(문자열) - 문자열 -> 배열 Bitconverter.ToUInt16(읽을배열, 읽을위치) - 배열특정위치 -> 문자열 (ushort일때 2바이트 추출) BitConverter.ToUInt16( new ReadOnlySpan()) - new ReadOnlySpan사용 하기 읽기전용, 안전성확보 excption public class Packet { public ushort size; public ushort packetId; } ..

[C#서버] TCP VS UDP

TCP 연결형 서비스(택배)1) 연결을 위해 할당되는 논리적인 경로가 존재한다.2) 전송 순서가 보장된다.3) 데이터 경계가 없어 packet을 한 번에 온전하게 받을 수 없을 때가 존재한다.속도와 신뢰성1) 패킷 유실이 일어나면 책임지고 다시 전송한다. 2) 물건을 주고 받을 상황이 아니면 일부만 보낸다.(흐름/혼잡제어)3) 고려할 것이 많으니 속도가 좋지 않다.UDP 비연결형 서비스(이메일, 비디오플레이)1) 연결이라는 개념이 없다.2) 전송 순서 보장되지 않는다.3) 데이터 경계가 존재하여 한 번 보낸 패킷을 온전하게 받을 수 있다.속도와 신뢰성1) 분실에 대한 책임을 지지 않는다.2) 일단 보내고 생각한다.3) 단순하기 때문에 속도가 빠르다.

[C#서버] 블로킹(Accept)와 논블로킹(AcceptAsync)

아래와 같이 Socket문법에서 Accept()는 블로킹 함수이다. 블로킹 함수란 무한정 대기한다는 뜻이다. 무수한 유저를 받기위해서는 블로킹 함수를 채택하는 것 은 바람직 하지 않을 수 있다. 결국 논블로킹 방법을 사용해야한다. 동기방식인 블로킹 문법 Accept() Socket _listenSocket; _listener.Accept() 비동기방식인 논블로킹 문법 AcceptAsync() internal class Listener { Socket _listenSocket; Action _onAcceptHandler; public void Init(IPEndPoint endPoint, Action onAcceptHandler) { //문지기 _listenSocket = new Socket(endPoin..