전체 글 483

[Mssql] 집계함수 - COUNT, DISTINCT, SUM, AVG, MIN, MAX

COUNT NULL 데이터가들어가 있으면 무시한고 집계한다. 집계함수에서 (*)할 수 있는 유일한 함수 SELECT COUNT(*) AS PLAYERCOUNT FROM PLAYERS; DISTINCT(중복제거) SELECT DISTINCT birthCity FROM PLAYERS; DISTINCT와 COUNT 함께사용 할 때 아래와 같이 사용하면 COUNT가 우선 순위기 때문에 DISTINCT 적용 안됨. SELECT DISTINCT COUNT(birthCity) FROM PLAYERS; 아래와 같이 해결 해야 된다. SELECT COUNT(DISTINCT birthCity) FROM PLAYERS; AVG SELECT AVG(CASE WHEN weight IS NULL THEN 0 ELSE weight..

DB/Mssql 2022.11.04

[C#서버][방법] 배치(bat)파일 사용 방법 Main(string[] args) args 인자 값 만들기

bat파일 만드는 방법 새로 만들기 -> 메모장 생성 -> 확장자명 .bat로 변경 1. START명령어를 사용하여 exe 실행 자동화 2. exe뒤에 ../../.......은 Main(string[] args) args의 인자값을 생성하는 부분 3. XCOPY /Y GenPackets.cs "../../DummyClient/Packet" XCOPY - 파일을 복사하여 다른 폴더에 저장하기 위해사용 /Y - 이미 파일이 존재한다면 덮어쓰기 protoc.exe -I=./ --csharp_out=./ ./Protocol.proto IF ERRORLEVEL 1 PAUSE START ../../../Server/PacketGenerator/bin/PacketGenerator.exe ./Protocol.prot..

VisualStudio/C# 2022.11.01

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

[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() 관대한 양보 => 관대하게 양보할테니 지금 실행이 가능한 쓰레드가 있으면 실행해라 => 실행 가능한 쓰레드가 없으면 남은 시간 자신에게 소진

[C#서버][개념] 임계영역 Spin락(스핀락(SpinLock))

SpinLock- 무작정 기다리는 방법 (단점 cpu점유율이 많이올라감) Context Switching - 소유권 포기후 다시접근하는 방법 AutoResetEvent - 운영체제 예약시스템으로 이벤트 사용하여 비어있으면 호출하여 접근 SpinLock SpinLock은 C#에서 제공되는 스레딩 동기화를 위한 클래스 중 하나입니다. SpinLock은 다른 스레딩 동기화 메커니즘과 달리 스레드가 잠금 해제될 때까지 계속해서 "스핀"하면서 대기하는 방식으로 동작합니다. 스핀은 프로세서가 일정한 시간 동안 루프를 실행하면서 아무 일도 하지 않는 것을 말합니다. SpinLock은 기본적으로 레커시브하지 않으며, 스핀을 사용하여 잠금을 획득하려고 시도합니다. 스핀락은 단일 프로세서 시스템에서는 효율적일 수 있지만,..