VisualStudio/C#서버 26

[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..

[C#서버][소스] 기본 서버, 클라이언트 소스

서버 static void Main(string[] arg) { //DNS (Domain Name System) -> www.xxxxx.com string host = Dns.GetHostName();//host는 goole.com 도메인주소 IPHostEntry ipHost = Dns.GetHostEntry(host);//도메인 주소를 통해 ip획득위해 IPAddress ipAddr = ipHost.AddressList[0];//0번은 ip6, 1번은 ip4 IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777); //문지기 Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, Prot..

[C#서버] TLS(Thread Local Storage) - 쓰레드로컬(ThreadLocal)

만약 멀티스레드 환경에서 수 많은 멀티스레드가 어떤 하나의 자원을 점유하고자 할 때 락이 잡혀 있다면 하나의 쓰레드 하나가 처리하는 속도 보다 못 할 수 있다. 이 때 쓰레드 각각 전용 공간에서 힙영역을 참조하면 효과적일 수 있다. 이러한 공간을 TLS라고 한다. (TLS의 하나의 예시일 뿐) ThreadLocal 만약 아래와 같이 static으로 선언된다면 프로젝트 내에 여러 곳 에서 사용될 수 있어 쓰레드에게 영향을 미치지만 ThreadLocal 키워드를 사용하면 각각 쓰레드마다 전용공간이 생긴 것 이기 때문에 다른 쓰레드에서 이름을 변경하여도 영향을 주지 않는다. 즉 공용 메모리를 사용하지 않는다. static ThreadLocal ThreadName = new ThreadLocal(); inter..

[C#서버][개념] 임계영역 특수락 - ReaderWriterLockSlim 특수상황 Lock 처리 방법

ReaderWriterLockSlim 이 클래스는 읽기 작업과 쓰기 작업 간의 동시성을 최적화하기 위해 설계되었습니다. ReaderWriterLockSlim은 일반적으로 읽기 작업이 많이 발생하고 쓰기 작업이 적은 상황에서 사용됩니다. 이 클래스를 사용하면 여러 스레드가 동시에 읽기 작업을 수행할 수 있지만, 쓰기 작업은 배타적으로 수행됩니다. 다시 말해, 한 스레드가 쓰기 작업을 수행하는 동안에는 다른 스레드는 읽기나 쓰기 작업을 할 수 없습니다. 평상시에는 Read락을 사용하다 특수한경우 어떤 쓰레드가 WriteLock을 사용하면 ReadLock을 사용하는 다른 모든 쓰레드는 자원을 사용하지 못하게 된다. class Reward { } static ReaderWriterLockSlim _lock = ..

[C#서버][개념] 임계영역와 Evnet락 (AutoResetEvent & ManualResetEvent)

AutoResetEvent 스레드가 AutoResetEvent를 기다리고 있는 동안 다른 스레드가 이 이벤트를 발생시키면, 대기 중인 하나의 스레드만 깨어납니다. 그 후, AutoResetEvent는 자동으로 리셋됩니다. Set 메서드를 호출하면 한 번만 대기 중인 스레드 중 하나가 깨어나고, 이벤트는 자동으로 리셋됩니다. 커널 동기화, 톨게이트느낌, _available.WaitOne(); 아래에 _available.Reset();사용하지 않아도 자동으로 락을 닫아준다. class Lock { //bool

[C#서버]임계영역과 SleepLock(컨텍스트스위칭)

Context Switching 컨텍스트 스위칭(Context Switching)은 운영 체제에서 실행 중인 여러 프로세스나 스레드 간에 실행을 전환하는 작업을 말합니다. 이러한 전환은 CPU가 한 작업에서 다른 작업으로 전환되는 과정을 포함합니다. 프로세스나 스레드는 실행을 위해 CPU를 사용하며, 한 프로세스나 스레드가 실행되고 있는 동안에도 다른 프로세스나 스레드로 전환될 수 있습니다. 이러한 전환은 여러 이유로 발생할 수 있습니다. 시분할(Time Slicing): 운영 체제는 CPU 시간을 여러 프로세스나 스레드에게 나누어 주어 각각에게 일정 시간 동안 실행할 기회를 부여합니다. 이 시간이 지나면 다른 프로세스나 스레드로 컨텍스트 스위칭이 발생합니다. 인터럽트(Interrupt): 하드웨어 인터..

[C#서버][개념] Thread.sleep 종류

Thread.Sleep(1) 무조건 1ms 쉰다. Thread.Sleep(0) 조건부 양보 나보다 우선순위가 낮은 애들한테는 양보 불가 => 우선순위가 나보다 같거나 높은 쓰레드가 없으면 다시 자기자신 실행우선순위낮은 쓰레드는 기아현상 발생가능 Thread.Yield() 관대한 양보 => 관대하게 양보할테니 지금 실행이 가능한 쓰레드가 있으면 실행해라 => 실행 가능한 쓰레드가 없으면 남은 시간 자신에게 소진