성댕쓰 똑똑한 생활

고정 헤더 영역

글 제목

메뉴 레이어

성댕쓰 똑똑한 생활

메뉴 리스트

  • 홈
  • 태그
  • 방명록
  • 분류 전체보기 (172)
    • 똑똑한 재테크 (1)
      • 올웨더 자산배분 (1)
    • 똑똑한 개발 (170)
      • Hazel 게임엔진개발 (0)
      • Algorithm 과 Data Structure (51)
      • C++ (18)
      • C# (8)
      • 개발로그 (0)
      • Image Processing (2)
      • C++ 게임개발 (60)
      • 컴퓨터 그래픽스 (10)
      • 수학 (13)
      • 영어 (8)

검색 레이어

성댕쓰 똑똑한 생활

검색 영역

컨텐츠 검색

똑똑한 개발

  • 논블록킹 소켓

    2021.11.09 by 성댕쓰

  • 소켓 옵션

    2021.11.08 by 성댕쓰

  • UDP 서버실습

    2021.11.06 by 성댕쓰

  • TCP vs UDP

    2021.11.05 by 성댕쓰

  • TCP서버 실습

    2021.11.05 by 성댕쓰

  • 소켓 프로그래밍 기초 #2

    2021.11.04 by 성댕쓰

  • 소켓 프로그래밍 기초 #1

    2021.11.03 by 성댕쓰

  • TypeCast

    2021.10.29 by 성댕쓰

  • Object pool

    2021.10.01 by 성댕쓰

  • Memory pool #3

    2021.09.30 by 성댕쓰

논블록킹 소켓

지금까지 작성한 소켓통신 코드는 모두 블록킹 코드이다. 여기에 한 가지 설정만 더하면 논블록킹 소켓으로 만들 수 있다. 해당 설정은 ::ioctlsocket(...)이다. 이를 이용해 논블록킨 소켓 서버, 클라이언트를 만들어보자. GameServer.cpp int main() { WSAData wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaData)) return 0; // 블록킹(Blocking)소켓 // accept -> 접속한 클라가 있을 때 // connet -> 서버 접속 성공했을 때 // send, sendto -> 요청한 데이터를 송신 버퍼에 복사했을 때 // recv, recvfrom -> 수신 버퍼에 도착한 데이터가 있고, 이를 유저레벨 버퍼에 복사했을..

똑똑한 개발/C++ 게임개발 2021. 11. 9. 22:13

소켓 옵션

TCP Socket통신할 때 다양한 Option을 줄 수 있다. 알아보자. ::setsockopt(...)로 socket option을 설정하고, ::getsockopt(...)로 socket option을 쿼리할 수 있다. 이 둘 함수의 첫 번째 파라미터는 연결한 socket이다. 두 번째 level은 옵션을 해석하고 처리할 주체를 의미한다. SOL_SOCKET 소켓 코드 IPPROTO_IP IPv4 IPPROTO_TCP TCP 프로토콜 SO_KEEPALIVE로 연결상태를 주기적으로 확인할 지 설정할 수 있다. 옵션을 사용하면 상대편 연결이 끊어지는 것을 감지할 수 있다. SO_LINGER는 소켓 통신 닫을 때 지연할 지 선택하는 옵션이다. ::shutdown함수를 이용해 Half-Close 기능을 구..

똑똑한 개발/C++ 게임개발 2021. 11. 8. 22:18

UDP 서버실습

TCP 서버 실습에서 만든 기능과 같은 일을 하면서 통신 방식만 UDP인 서버를 만들어보자. GameServer.cpp void HandleError(const char* cause) { int32 errCode = ::WSAGetLastError(); cout

똑똑한 개발/C++ 게임개발 2021. 11. 6. 14:25

TCP vs UDP

TCP와 UDP의 차이를 비교해보면서 각각의 특성을 알아보자. TCP와 UDP는 네트워크 단계중 트랜스포트 단계에서 정의하는 통신방식이다. 연결지향성 TCP UDP 연결을 위해 할당되는 논리적인 경로가 있다. 연결이라는 개념이 없다. 전송 순서가 보장된다. 전송 순서 보장 안한다. boundary 개념 없다. boundary 개념 있다. 송신자가 |Hello| |World|를 보냈을 때, TCP는 전송 순서가 보장되고 boundary의 개념이 없기 때문에 |HelloWor| |ld|로 받을 가능성이 있다. UDP는 전송 순서가 보장되지 않고 boundary 개념이 있기 때문에 |World| |Hello|로 받을 가능성이 있다. 속도와 신뢰성 TCP UDP 분실이 일어나면 책임지고 다시 전송한다. 분실에 ..

똑똑한 개발/C++ 게임개발 2021. 11. 5. 23:46

TCP서버 실습

TCP 클라이언트, 서버 코드 몇 가지 실습하면서 TCP 통신의 특징을 살펴보자. client server 모두 메세지 송 수신 할 수 있다. DummyClient.cpp int main() { WSAData wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaData)) return 0; SOCKET clientSocket = ::socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) { int32 errCode = ::WSAGetLastError(); cout

똑똑한 개발/C++ 게임개발 2021. 11. 5. 22:19

소켓 프로그래밍 기초 #2

소켓 client, server를 직접 만들어보자. 윈도우 라이브러리를 이용한 방법이다. DummyClient.cpp #include #include #include #pragma comment(lib, "ws2_32.lib") int main() { // 윈속 초기화 (ws2_32 라이브러리 초기화) // 관련 정보가 wsaData에 채워짐 WSAData wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaData)) return 0; // ad: Address Family (AF_INET = IPV4, AF_INET6 = IPv6) // type : TCP(SOCK_STREAM) vs UDP(SOCK_DGRAM) // protocol : 0 // return : desc..

똑똑한 개발/C++ 게임개발 2021. 11. 4. 22:54

소켓 프로그래밍 기초 #1

소켓 프로그래밍을 손님이 식당에 문의하고 식당이 손님과 통화하는 비유로 살펴보자 먼저 손님입장에서 비유와 대응하는 실제를 보면 다음과 같다. 손님입장 소켓 클라이언트 핸드폰 준비 소켓 준비 식당 번호로 문의 서버 주소로 Connect 대리인을 통해 식당 측과 대화 가능 소켓을 통해 서버와 패킷 송수신 가능 식당입장 비유와 대응하는 실제를 보면 다음과 같다. 식당입장 소켓 서버 안내원 고용 Listener 소켓 준비 안내원 교육 (대표 번호 배정) Bind (서버 주소/Port를 소켓에 연동) 영업 시작 Listen 안내 Accept 대리인을 통해 손님과 대화 가능 클라이언트 세션을 통해 손님과 통화 가능 코드를 통한 예제는 소켓 프로그래밍 기초#2에서 다루겠다. 참조 : [C++과 언리얼로 만드는 MMO..

똑똑한 개발/C++ 게임개발 2021. 11. 3. 22:55

TypeCast

TypeCast는 Modern C++ Design책에 나오는 내용이다. 필수 알아야 할 기능은 아니지만 해당 내용을 공부하면서 얻게 되는 지식들이 꽤 쓸만하다. class Player { public: virtual ~Player(){} } class Knight : public Player { public: } class Mage : public Player { public: } int main() { Player* p1 = new Knight(); Player* p2 = new Mage(); Knight* k1 = static_cast(p2); } Mage pointer인 p2를 Knight pointer로 캐스팅하면 당시 오류는 발생하지 않지만 실제로 메모리 참조가 잘못되고 있다. dynamic_c..

똑똑한 개발/C++ 게임개발 2021. 10. 29. 23:11

Object pool

memory pool을 쓰면 메모리를 재사용하기 때문에 메모리 접근 오류가 있어도 한참 뒤에 문제가 발생하는 문제가 있다. 어떤 클래스에서 이런 문제가 발생했는지 확인하려면 상당히 많은 시간이 소요된다. Object pool은 이런 문제를 해결하기 위해 고안한 memory pool이다. 같은 Object는 같은 memory pool을 쓰도록 동작한다. ObjectPool.h #pragma once #include "Types.h" #include "MemoryPool.h" template class ObjectPool { public: template static Type* Pop(Args&& ...args) { Type* memory = static_cast(MemoryHeader::AttchHeade..

똑똑한 개발/C++ 게임개발 2021. 10. 1. 22:17

Memory pool #3

마이크로 소프트에서 제공하는 lock free stack을 활용하여 #2 와 같은 기능을 하는 memory pool을 만들 수 있다. 먼저 간단한 활용을 살펴보자. DECLSPEC_ALIGN(16) class Data { public: SLIST_ENTRY _entry; int64 _rand = rand() % 1000; }; SLIST_HEADER* GHeader; int main() { GHeader = new SLIST_HEADER(); ASSERT_CRASH(((uint64)GHeader % 16) == 0); ::InitializeSListHead(GHeader); for (int32 i = 0; i Launch([]() { while (true..

똑똑한 개발/C++ 게임개발 2021. 9. 30. 22:30

추가 정보

인기글

최신글

페이징

이전
1 ··· 7 8 9 10 11 12 13 ··· 17
다음
TISTORY
성댕쓰 똑똑한 생활 © Magazine Lab
페이스북 트위터 인스타그램 유투브 메일

티스토리툴바