본문 바로가기

전체 글351

[C#] UDP Socket을 이용한 통신 UDP 참고 : UDP - 나무위키 (namu.wiki) UDP - 나무위키 데이터 신뢰성 문제가 있는 프로토콜이라 우스갯소리로 Unreliable Damn Protocol(믿지 못할 빌어먹을 프로토콜)의 축약어라 부르는 경우도 있다. UDP라는 독자적인 규약으로 떨어져 나오긴 했으나 사 namu.wiki 1. 서버 class Program { static void Main(string[] args) { Console.WriteLine("UDP Server"); ServerFunc(); } private static void ServerFunc() { // IPv4, 스트림, TCP --> TCP는 스트림으로, UDP는 데이터그램으로 using (Socket svrSocket = new Socket(Ad.. 2020. 12. 4.
[C#] TCP Socket을 이용한 통신 TCP 참고 : TCP - 나무위키 (namu.wiki) TCP - 나무위키 TCP는 전화를 거는 것처럼 상대와 연결을 설정하고 통신을 시작한다. 절차는 아래와 같다. Three Way Handshake 1) 상대에게 통신을 하고 싶다는 메시지를 보낸다. (SYN) 2) 상대는 그 메시지에 대한 응답 namu.wiki 1. 서버 class Program { static void Main(string[] args) { Console.WriteLine("Tcp Server"); ServerFunc(); } private static void ServerFunc() { // IPv4, 스트림, TCP --> TCP는 스트림으로, UDP는 데이터그램으로 using (Socket svrSocket = new So.. 2020. 12. 4.
[Delphi] WaitForSingle을 이용한 쓰레드 종료 쓰레드가 돌고 있을 때 폼과 같이 종료하는 법. Var KillEvt: THandle; procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction); begin SetEvent(KillEvt); end; // 쓰레드 execute 안에 . . if WaitForSingleObject(KillEvt, 60000 * 1) = WAIT_OBJECT_0 then // 1분마다. exit; 참고 MSDN : WaitForSingleObject function (synchapi.h) - Win32 apps | Microsoft Docs WaitForSingleObject function (synchapi.h) - Win32 apps Waits unti.. 2020. 12. 4.
[Delphi] TIdMappedPortTCP를 이용한 허용된 ip만 추가하는 포트포워딩 1. 서비스 THanilnPortFowarding_Service = class(TService) CryptographicLibrary1 : TCryptographicLibrary; Codec1 : TCodec; procedure ServiceCreate(Sender : TObject); procedure ServiceStart(Sender : TService; var Started : Boolean); procedure ServiceStop(Sender : TService; var Stopped : Boolean); procedure ServicePause(Sender : TService; var Paused : Boolean); procedure ServiceContinue(Sender : TServi.. 2020. 12. 4.
[Delphi] Vcl.Themes 콤보박스로 설정 uses Vcl.Themes, Vcl.StdCtrls procedure TForm7.ComboBox1Change(Sender: TObject); begin TStyleManager.SetStyle(ComboBox1.Text); end; procedure TForm7.FormCreate(Sender : TObject); var StyleName : string; begin for StyleName in TStyleManager.StyleNames do ComboBox1.Items.Add(StyleName); ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(TStyleManager.ActiveStyle.Name); end; 2020. 12. 3.
[Delphi] 병렬 프로그래밍 1. TTask System.Threading.TTask - RAD Studio API Documentation (embarcadero.com) System.Threading.TTask - RAD Studio API Documentation From RAD Studio API Documentation Delphi TTask = class(TAbstractTask, TThreadPool.IThreadPoolWorkItem, ITask, TAbstractTask.IInternalTask) C++ class PASCALIMPLEMENTATION TTask : public TAbstractTask Properties Type Visibility Source Unit Parent class publi docwik.. 2020. 12. 3.
[Hyper V] 가상 스위치 외부, 내부 가상 스위치 생성 2020. 12. 2.
[Hyper V] windows 10에서 가상화 머신 활성화 1. windows 10 pro, Enterprise 이상 2. 작업관리자에서 CPU - 가상화 부분 확인 -> 사용이 아니라면 CPU에 맞게 BIOS 환경에 들어가 가상화 사용 세팅 3. Hyper-V 모두 활성화 및 재부팅 4. Hyper-V 관리자 실행. 5. 새로 만들기 6. 이름 및 경로 지정 7. 세대 지정 참고 MSDN : 1 또는 2세대 가상 머신을 Hyper-v에서 만들어야 하나요? | Microsoft Docs 1 또는 2세대 가상 머신을 Hyper-v에서 만들어야 하나요? 에서는 지원 되는 부팅 방법 및 기타 기능 차이와 같은 고려 사항을 제공 하 여 요구 사항을 충족 하는 세대를 선택할 수 있습니다. docs.microsoft.com 8. 메모리 설정 동적 메모리를 사용해서 사용량에.. 2020. 12. 2.
[C#] 8.0 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용 .NET Framework: 866. C# - 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용 (sysnet.pe.kr) { // 무한 루프를 돌며, while (count-- > 0) { / Native Heap, 즉 비-관리 힙으로부터 배열 메모리 할당 using (NativeMemory buf = new NativeMemory(bufSize)) { Span viewBuf = buf.GetView(); viewBuf[0] = 0; viewBuf[bufSize - 1] = 0; } } }; } 2020. 12. 1.
[C#] BCL DataContractJsonSerializer을 이용한 객체 JSON 직렬화 닷넷에서 직렬화/역직렬화 방식은 3가지가 있다. 1. BinaryFormatter 2. XmlSerializer 3. DataContractJsonSerializer // 참고 MSDN : DataContractJsonSerializer 클래스 (System.Runtime.Serialization.Json) | Microsoft Docs DataContractJsonSerializer 클래스 (System.Runtime.Serialization.Json) 개체를 JSON(JavaScript Object Notation)으로 직렬화하고 JSON 데이터를 개체로 역직렬화합니다.Serializes objects to the JavaScript Object Notation (JSON) and deserializ.. 2020. 11. 30.
[C#] BCL MemoryStream, StreamWriter/Reader, BinaryWriter/Reader Stream 타입은 일련의 바이트를 일관성 있게 다루는 공통 기반을 제공한다 Stream의 사전적 의미는 "흐름"인테, 프로그래밍에서 사용될 때는 일반적으로 "바이트 데이터의 흐름"을 의미하며 흐름이라는 단어에서 의미하는 Stream은 데이터를 쓰고 읽는 작업을 순서대로 하는 것이 기본 정책이다. MemoryStream은 Stream 추상 클래스를 상속받은 타입니다. 메모리에 바이트 데이터를 순서대로 읽고 쓰는 작업을 수행하는 클래스다. 이를 이용하면 데이터를 메모리에 직렬화/역직렬화 하는 것이 가능하다. static void Main(string[] args) { Console.WriteLine("System.IO. MemoryStream, StreamWriter/Reader, BinaryWriter/.. 2020. 11. 29.
[C#] BCL Regex 정규식을 이용한 이메일 규칙 판별 1. 기본 방법 (정규식 이용 x) * 반드시 @ 문자를 한번 포함해야 한다. * @문자 이전의 문자열에는 문자와 숫자만 허용된다(특수문자 x) * @문자 이후의 문자열에는 문자와 숫자가 허용되지만 반드시 하나의 . 이 포함되어야 한다. static void Main(string[] args) { Console.WriteLine("System.Text.RegularExpressions.Regex"); string email = "tjdskaqks@gmail.com"; Console.WriteLine(IsEmail(email)); } private static bool IsEmail(string email) { string[] parts = email.Split('@'); if (parts.Length !.. 2020. 11. 29.
[C#] BCL Encoding 타 언어 프로그램과 데이터 주고 받기 static void Main(string[] args) { Console.WriteLine("System.Text.Encoding"); string textData = "Hello World"; byte[] buf = System.Text.Encoding.UTF8.GetBytes(textData); // // buf 바이트 배열을 타 언어 프로그램으로 전달. // byte[] receivedbuf = ... // 타 언어 프로그램으로부터 전달받은 바이트 배열 데이터 string receivedText = System.Text.Encoding.UTF8.GetString(receivedbuf); } 2020. 11. 29.
[C#] BCL string과 StringBuilder의 차이점 string 타입은 불변 객체(immutable object)이기 때문에 string에 대한 모든 변환은 새로운 메모리 할당을 하게된다. 예를 들어 string.ToLower() 메소드를 보자. string txt = "Hello World"; string lwrTxt = txt.ToLower(); txt 변수는 힙에 있는 "Hello World"를 가리킨다. 그 상태에서 ToLower()를 호출하면 원문이 통째로 복사된 다음에 그것이 소문자로 변경되어 반환된다. 불변 타입의 string 클래스가 발생시키는 가장 큰 문제는 문자열을 더할 때다. 아래 코드를 실행 결과 8초가 걸렸다. // string 1. 힙(heap)에 "Hello World" 문자열을 담은 공간을 할당. 2. 스택에 있는 txt 변수.. 2020. 11. 29.
[C#] BCL string Format 자리수 지정 {번호 [, 정렬][: 형식문자열]} 번호(필수) : 0부터 시작 정렬(선택) : 번호에 대응되는 문자열의 최소 너비를 지정. 만약 대응 문자열의 길이는 5인데 정렬되 지정된 숫자가 10이라면 나머지 5의 너비는 공백으로 채워짐. 정렬 값이 음수면 왼쪽으로, 양수면 오른쪽으로 정렬이 된다. 만약 정렬값이 생략되면 대응되는 문자열의 길이대로 출력된다. 형식문자열(선택) : 대응되는 인자의 타입에서 직접 구현하고 있는 형식 문자열이 사용됨. static void Main(string[] args) { Console.WriteLine("string Format 이용"); string txt = "{0, -10} * {1} == {2, 10}"; // 실행결과 사진을 보면 왼쪽으로 정렬되어 있고 5*6(30)은.. 2020. 11. 28.
[C#] BCL - string 대소문자 구분 EndWith, IndexOf, StartWith의 기본은 대소문자를 구분한다. 구분하고 싶지 않다면 두번째 인자에 StringComparison.OrdinalIgnoreCase 를 추가하면 된다. static void Main(string[] args) { Console.WriteLine("영문자 대소문자 구분 방법"); string txt = "Hello World"; Console.WriteLine($"{txt} EndWith(\"WORLD\"): {txt.EndsWith("WORLD")}"); Console.WriteLine($"{txt} EndWith StringCoparion.OrdinalIgnoreCase(\"WORLD\"): {txt.EndsWith("WORLD", StringCompari.. 2020. 11. 28.
[C#] BCL - Stopwatch로 시간차 계산 static void Main(string[] args) { Console.WriteLine("StopWatch을 이용한 시간차 계산"); System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch(); st.Start(); sum(); st.Stop(); // st.ElapsedTicjs 속성은 구간 사이에 흐른 타이머의 틱 수 Console.WriteLine($"Total Ticks : {st.ElapsedTicks}"); // st.ElapsedMilliseconds 속성은 구간 사이에 흐른 시간을 밀리초로 반환 Console.WriteLine($"millisecond : {st.ElapsedMilliseconds}"); // 밀리초로 흐.. 2020. 11. 28.
[C#] BCL - DateTime Tick으로 시간차 계산 static void Main(string[] args) { Console.WriteLine("DateTime을 이용한 시간차 계산"); // DateTime은 struct로 정의된 값 형식 DateTime befor = DateTime.Now; sum(); DateTime after = DateTime.Now; long gap = after.Ticks - befor.Ticks; Console.WriteLine($"Total Ticks : {gap}"); Console.WriteLine($"millisecond : {gap / 10000}"); // 10,000 주의 tick = 1ms*10000 Console.WriteLine($"second : {gap / 10000 / 1000}"); Console.. 2020. 11. 28.
[C#] Dispose 상속 및 재정의 class ClientClass : IDisposable { private bool disposedValue; protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // TODO: 관리형 상태(관리형 개체)를 삭제합니다. } // TODO: 비관리형 리소스(비관리형 개체)를 해제하고 종료자를 재정의합니다. // TODO: 큰 필드를 null로 설정합니다. // 비관리 메모리 해제구문 disposedValue = true; } } // // TODO: 비관리형 리소스를 해제하는 코드가 'Dispose(bool disposing)'에 포함된 경우에만 종료자를 재정의합니다. // ~ClientClass() .. 2020. 11. 27.
[델파이 - DELPHI] m4a to wav(PCM) uses Vcl.StdCtrls, ACS_Converters, SyncObjs, Activex, ACS_Classes, ACS_Wave, ACS_AAC type TForm7 = class(TForm) AdvFileNameEdit1 : TAdvFileNameEdit; AdvFileNameEdit2 : TAdvFileNameEdit; Button2 : TButton; AdvComboBox2 : TAdvComboBox; AdvComboBox3 : TAdvComboBox; AdvEdit1 : TAdvEdit; AdvComboBox4 : TAdvComboBox; Memo1 : TMemo; ProgressBar1 : TProgressBar; procedure Button2Click(Sender : TObject);.. 2020. 11. 24.