목록Language (77)
Coding Memo
에러 내용 ::WSAGetLastError()로 얻은값이 10022 (WSAEINVAL)값으로 에러가 발생했다. 나의 경우 ConnectEx함수 호출 후, 위 에러가 나타났다. 찾아보니 인수가 잘못되었다는 에러였는데, 도대체 여러개의 인자들 중 무엇이 잘못되었는지 몰라서 당황했다. (필요한 인자가 nullptr도 아니었고, 잘못된 인자가 없었다.) ConnectEx 문서를 보니 바로 이유를 알게 되었다... 해결 ConnectEx에 사용하는 소켓은 반드시 바인딩 되어 있어야 한다. ConnectEx 호출 이전에 소켓에 ::bind를 통해 나중에 연결에 사용될 로컬 주소와 포트를 바인딩해주면 된다. 추가적으로 소켓에 대한 유의 사항을 정리하면 소켓은 바인딩되어 있어야 한다. (주의할 점은 연결 할 엔드포인..

Error Create~~를 이용해 flatbuffer관련 객체나 구조체를 생성할 때 나타나는 에러이다. assert에 의한 에러이다. Problem 다음은 문제의 코드이다. CreateString을 이용해 flatbuffer 문자열을 만드는 중에 에러가 발생했다. #pragma comment(lib, "Release\\flatbuffers.lib") #include "flatbuffers/flatbuffers.h" #include "flatbuffers/util.h" #include "flatbuffers_scehmas/MyGame_generated.h" #include using namespace std; using namespace MyGame; int main() { // error codes {..
가상 소멸자 (virtual destructor)은 C++의 다형성과 관련된 기능 중 하나이다. 다음 코드에서와 같이 기본 클래스 (base class, parent class)에서 파생 클래스 (derived class, child class)의 포인터를 사용할 때, 파생 클래스의 소멸자를 호출하기 위해 가상 소멸자를 사용한다. class Base { }; class Derived : public Base { }; int main() { Base* ptr = new Derived(); // 파생 클래스의 포인터를 기본 클래스 포인터로 저장 /// ... return 0; } 위 코드에서 만약 delete ptr를 한다면 Base의 소멸자만 호출이 된다. 즉, Base에 대한 데이터는 delete 되지만..

C++ 컴파일러는 메모리에 구조체나 클래스를 배치할 때, 반드시 빈공간 없이 빽빽하게 메모리를 사용하지 않는다. 컴파일러는 CPU의 데이터 접근 효율성 향상을 위해 특정한 값으로 정렬을 하여 메모리에 데이터를 배치시킨다. (데이터 형식에 따른 일정한 간격 유지) (예를 들어, int 타입의 데이터는 빠른 메모리 접근을 위해 4배수의 메모리 주소에 저장할 것이다. 이로 인해 이전 메모리 공간에 빈 공간 (padding)이 생길 수 있다.) 만약 위 구조체에서 b가 int 타입이 아닌 double 타입이었다면 b를 8바이트 정렬하기 위해 a이후에 패딩을 추가할 것이다. | a(2) | padding(6) | b(8) | 즉, padding은 다음 순서에 오는 멤버의 데이터의 형식에 따라 존재여부와 사이즈가 ..

Summary Web 상에서의 Http, Https를 이용한 req/res의 body의 text를 직렬화/역직렬화할 때, 타입에 유의하자. nullable 타입과 그렇지 않은 타입은 다르게 직렬화/역직렬화 된다. (예를 들어 int? 타입은 "null"값으로 파싱하지만, 단순 int 타입은 0(default) 값이 될 것이다.) nullable 타입은 아예 text로 `null`이라는 값으로 들어온다. 반드시 서버와 클라이언트에서 같은 데이터에 대한 클래스의 멤버 타입들은 특별한 이유가 없다면 동일하게 해주자.C# 8.0 부터 nullable 기능이 도입되었다. 이 Nullable Reference Types를 사용하면 null이 될 수 있는 참조형 변수와 될 수 없는 참조형 변수를 구분할 수 있다. 즉..
Visual Studio에는 실행을 하기위한 Application이 아닌 Class Library로 프로젝트를 빌드를 했을 때 유용한 기능이 있다. (C# 뿐만 아니라 다른 언어에 대해서도 지원한다.) 라이브러리 프로젝트에 담긴 형식에 맞는 주석(xml 형식)을 빌드한 라이브러리 파일을 가져다 사용하는 프로젝트에서도 동일하게 확인할 수 있다. 위 이미지는 라이브러리 프로젝트에서의 코드이다. summary를 작성하고 마우스를 클래스에 올려다 두면 해당 설명이 표시가 된다! (흔히 코드를 작성할 때, 미리 컴파일되어 있는 파일에 있는 프로퍼티나 함수에 대한 설명이 나오는 것이 바로 이런 것이다.) 위와 같은 기능을 컴파일된 라이브러리를 사용하는 다른 프로젝트에서도 동일하게 사용할 수 있다! 먼저 간단하게 주..
Entity Framework에서 데이터 모델 클래스를 작성할 때, Navigation Property (네비게이션 속성)에 virtual 키워드를 붙일 수 있다. virtual 키워드는 Entity Framework가 이 속성(property)를 Lazy Loading 하도록 한다. Lazy Loading은 해당 클래스나 객체를 로드시에 같이 바로 로드되는 것이 아니라, 관련된 데이터가 실제로 필요한 시점에만 데이터베이스로부터 로드하도록 한다. 아래와 같은 모델이 있다고 사정하자. [Table("User")] public class UserDb { [Key] public ulong UserId { get; set; } public string UserName { get; set; } } [Table("..

BitConverter는 .NET에서 제공하는 API로 기본 primitive 타입들의 데이터를 바이트 배열(byte[])로 직렬화하거나 바이트 배열을 역직렬화하는 기능을 제공한다. 제공되는 Primitive Types - Boolean - Char - Double - Int16 (short) - Int32 (int) - int64 (long) - Single (float) - UInt16 (ushort) - UInt32 (uint) - UInt64 (ulong) Note: float형이 Single로 된다는 것을 유의하자. 아래 문서에 자세히 나와 있다. https://learn.microsoft.com/ko-kr/dotnet/api/system.bitconverter?view=net-8.0 BitCo..