XMLDeclaration : XML의 버전, 즉 처음 생기는 를 생성하는 클래스 인스턴스 XMLElement : 실질적으로 각 노드 및 데이터 입력 공간을 생성할 수 있다. 이 공간에 데이터를 넣거나, 텍스트를 넣을 수 있다. 파일 생성하는 부분 void ResourcesManager::WriteResource(wstring filePath) { MakeRandomBallers(); wstring finalPath = _resourcePath + filePath + L".xml"; auto path = filesystem::path(finalPath); filesystem::create_directory(path.parent_path()); string forder = path.parent_path()..
하게 된 이유 - 프로젝트들에 앞서 기둥이 되는 서버와 클라이언트 네트워크 코드를 매번 직접 작성했었는데, 이번 기회에 기본이 되는 서버단을 구현해놓고 사용하기 위해서 C++ IOCP 서버와 Select 서버, C# 클라이언트 서버를 구성하였습니다. 그 와중에 이 파트는 C# 비동기 클라이언트 서버를 구축하는 이야기입니다. 먼저 들어가기에 앞서, 비동기란? https://jiyun-hong.tistory.com/107 소켓 통신의 종류 - 동기, 비동기, 블록킹, 논 블록킹 소켓 통신 종류에는 물론 TCP와 UDP가 존재하지만, 그 두 가지에서도 여러 방향으로 나뉘게 된다. 크게 네 가지로 나뉘는데 먼저 동기인가 비동기인가, 두 번째로 블록킹이냐 논 블록킹이냐 두가 jiyun-hong.tistory.co..
소켓 통신 종류에는 물론 TCP와 UDP가 존재하지만, 그 두 가지에서도 여러 방향으로 나뉘게 된다. 크게 네 가지로 나뉘는데 먼저 동기인가 비동기인가, 두 번째로 블록킹이냐 논 블록킹이냐 두가지 형태로 나뉜다. 동기 : 호출하자마자 바로 실행, 즉 호출하는 시점 = 실행하는 시점 비동기 : 호출을 해도 순서가 오지 않으면 늦게 실행될 수도 있음. 즉 호출하는 시점 ≠ 실행하는 시점 블록킹 : 함수를 호출하면 실행될 때 까지 기다린다. 기다리는 동안에는 다른 활동 X 논 블록킹 : 함수를 호출해도 다른 활동 가능, 참고로 비동기 관련해서 두 가지의 패턴이 존재하는데 Reactor Pattern 과 Proactor Pattern 패턴이다. 자세하게는 설명하지 않겠지만, 관련되어서 간단하게 설명하자면 Rea..
하게 된 이유 - 프로젝트들에 앞서 매번 기둥이 되는 서버를 직접 작성했었는데, 이번 기회에 기본이 되는 서버단을 구현해놓고 사용하기 위해서 C++ IOCP 서버와 Select 서버, C# 클라이언트 서버를 구성하였습니다. 그러다보니 C++과 C#을 함께 사용하기 위해 패킷을 직렬화 해야되는데 그 부분을 Protocol Buffer로 하기 위해 설치하게 되었습니다. 먼저 과정에 설명하기 앞서서, 아직 프로토콜 버퍼 뉴비이기 때문에 전체적인 옵션들에 대해서 미숙하다는 점을 미리 설명드립니다. 과정 - 먼저, https://github.com/protocolbuffers/protobuf 에 접속하여 기초 소스들을 다운받아야 합니다. 소스는 GitHub release page를 클릭하면 버전들이 나오게 되고,..
EX 시리즈란? 비동기 입출력의 경우, WSARecv와 WSASend를 통해 send와 recv는 호출을 받을 수 있다. 그렇지만 원래 사용하던 connect나 disconnect, accept는 비동기 호출을 받을 수 없다. 그런 부분을 확장하기 위해 나온 API가 아래 세 가지이다. ※ 사용하기 위해서는 WSAIoctl을 통해 런타임에 초기화를 진행하여야 합니다. WSAIoctl - 초기화 함수 위 원형에서 제일 중요한 부분은 dwIoControlCode 입니다. dwIoControlCode에는 필수적으로SIO_GET_EXTENSION_FUNCTION_POINTER 가 들어가야 합니다. 만약 들어가게 되면 lpvInBuffer에는 GUID라는 특별한 아이덴티티가 들어가게 됩니다. GUID의 종류는 아..
속성 이름 속성 내용 SO_LINGER Close 되었을 때, 소켓 버퍼에 남아있는 데이터를 어떻게 할 것인지 결정 SO_REUSEADDR 커널이 bind 정보를 들고 있을 때, 재 사용이 가능하도록 한다. SO_RCVBUF RecvBuffer 크기 결정 SO_SNDBUF SendBuffer 크기 결정 TCP_NODELAY Nagle 알고리즘 -> 작은 데이터들을 모아서 한번에 보내는 알고리즘( 껏다 켜기 ) SO_UPDATE_ACCEPT_CONTEXT ListenSocket의 특성을 ClientSocket에 그대로 적용 Linger 더보기 LINGER option; option.l_onoff = onoff; option.l_linger = linger; SetSockOpt(socket, SOL_SOCK..
소멸자로부터 예외가 터져 나가는 경우를 C++ 언어에서 막는 것은 아니지만, 실제 상황을 들춰보면 확실히 우리가 막을 수밖에 없는 것 같습니다. 예를 들어 보죠. class Widget{ public: ~ Widget(){ } //이 함수로부터 예외가 발생합니다. }; void doSometing() { std::vector v; ... }// v는 여기서 자동으로 소멸됩니다. 다음과 같은 상황에서 백터 v가 10개라고 가정하였을 때, 함수가 끝나고 소멸하게 되는데 이때 첫 번째 객체에서 소멸자가에서 오류가 발생한 이후, 또 다시 두 번째 객체에서 소멸자에서 오류가 발생하게 되면, 두개의 예외가 동시에 만들어진 상태입니다. 그렇게 되면 프로그램이 터지던지 정의되지 않은 행동을 보일텐데 이때는 정의되지 않..
Class를 생성할 때, 컴파일러는 기본적으로 생성자, 소멸자, 복사 생성자, 복사 대입 생성자를 자동으로 생성하게 된다. class Empty(){ public: Empty(){ } ~Empty() { } Empty(const Empty& rhs) { } Empty& operator=(const Empty& rhs) { } } Empty e1;// 기본 Empty e2(e1);// 복사 e2 = e1;// 복사 대입 이렇게 자동으로 생성되는 코드는 예상치 못한 오류를 일으킬 수 있습니다. 예를 들어 가상 소멸자가 생성되어야 하는데 비가상 소멸자가 생성된다던가, 몰래 만들어진 복사 생성자로 인해 객체가 예상치 못한 작동을 할 수도 있죠. 고로 이러한 함수들은 막거나, 직접 생성하여야 합니다. 이 내용은 ..
- Total
- Today
- Yesterday
- STL
- 학교
- 워셜알고리즘
- 개발
- 야경
- 지뢰찾기
- 컨퍼런스
- 백준
- 정보보안
- 인제대학교
- Dreamhack
- 보안
- 링크드 리스트
- 멀티쓰레드
- 더블버퍼링
- 드림핵
- 고양이
- queue
- 시스템보안
- 자료구조
- 레지스터
- c++
- 스레드풀
- 알고리즘
- BFS
- Select모델
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |