250920

lililllilillll·2025년 9월 20일

개발 일지

목록 보기
300/350

✅ 한 것들


  • 넥토리얼 코테 : 2/6솔
    • 얼렁뚱땅 되겠지 하지 말고 자료형이랑 크기 보고 칼같이 메모리, 시간 제한 조건 맞추는 연습 해야 한다
    • 골랜디 겨우 할 정도면 안되고, 최소 다이아는 찍고 오라는 느낌이었다
  • 윤성우의 열혈 TCP/IP 소켓 프로그래밍
  • Cherno Game Engine Course


📖 윤성우의 열혈 TCP/IP 소켓 프로그래밍


03-4 인터넷 주소의 초기화와 할당

IP 주소 할당할 때 201.211 ...을 하나의 정수로 바꿔야 한다.
inet_addr() : 문자열 IP 주소를 32비트 정수형이자 네트워크 바이트 순서로 변환
inet_aton() : 구조체 변수 in_addr만 넘겨주면 32비트 정수형, 네트워크 바이트 순서 변환
inet_ntoa()

  • 반대로 문자열 IP 정보로 변환.
  • 내부적으로 할당했던 char 포인터를 반환하니, 유지해야하면 별도 메모리로 할당 필요.
  • 반대로 inet_ntoa가 반환하는 포인터는 항상 내부 static 버퍼를 가리키므로 다른 주소 넣었을 때 돌려써도 된다.

struct sockaddr_in addr;
char *serv_ip = "211.217.168.13"; // IP주소 문자열 선언
char *serv_port = "9190"; // PORT 번호 문자열 선언
memset(&addr, 0, sizeof(addr)); // 구조체 변수 addr의 모든 멤버 0으로 초기화 (sin_zero를 초기화하기 위함)
addr.sin_family = AF_INET; // 주소체계 지정
addr.sin_addr.s_addr = inet_addr(serv_ip);  // 문자열 기반의 IP 주소 초기화
addr.sin_port = htons(atoi(serv_port)); // 문자열 기반의 PORT 번호 초기화

인터넷 주소의 초기화

  • s_addr을 상수 INADDR_ANY로 초기화하면 소켓 동작 컴퓨터 IP 주소 자동 할당. 여러 IP 주소 갖고 있을 시 어느 IP 주소여도 PORT만 일치하면 수신.
  • 이제 이걸 bind()로 소켓에 넣으면 된다

03-5 윈도우 기반으로 구현하기

윈도우에는 inet_aton() 대신 WSAStringToAddress()와 WSAAddressToString()이 있다.
IPv4와 IPv6에서도 사용이 가능하다. 하지만 운영체제 종속적인 코드가 된다.

내용 확인 문제

스위치 : MAC 주소로 같은 네트워크 장치 연결
라우터 : IP 주소로 다른 네트워크 간 데이터 전달

bind()할 때 프로토타입과 달리 sockaddr이 아닌 sockaddr_in을 사용하는 이유
: sockaddr은 프로토콜 독립적, sockaddr_in은 IPv4 전용 주소 구조체

0x12345678을 저장한다고 가정
빅 엔디안

  • 가장 상위 바이트(0x12)를 메모리의 낮은 주소에 저장
  • 0x12 0x34 0x56 0x78
    리틀 엔디안
  • 가장 하위 바이트(0x78)를 메모리의 낮은 주소에 저장
  • 0x78 0x56 0x34 0x12
    네트워크 바이트 순서 : 빅 엔디안


🎞️ Cherno Game Engine Course


Using Libraries in C++ (Static Linking)

https://www.youtube.com/watch?v=or1dAmUO8k0

  • 패키지 매니저 보다는 모든 의존성이 프로젝트 안에 실제로 저장된게 좋다
  • binary 파일을 linking하는 것보다 직접 컴파일하는게 좋다
    • 비쥬얼 스튜디오로 static 혹은 dynamic 라이브러리로 컴파일해라
    • 소스코드에 접근 못하거나, 가벼운 프로젝트라면 binary를 link해라

라이브러리 버전, 요소 설명 (glfw 라이브러리의 pre-compiled binaries 예시)

  • x64, x86은 본인 컴퓨터가 아니라 타겟 운영체제에 맞추는 것
  • include 디렉토리 : header 파일 더미
  • lib 디렉토리 : pre-built binary 파일
    • static library : 실행 파일에 직접 포함됨. 보통 컴파일러 최적화 덕에 더 빨라서 이걸로 한다.
    • dynamic library : 런타임에 링크됨

실습

  • Visual Studio에 빈 프로젝트 생성
  • 솔루션 있는 폴더에 Dependencies 폴더 생성하고 그 안에 GLFW 폴더 생성하고 그 안에 다운받았던 glfw 파일 넣기
    • glfw 중 include 파일과 vc-20xx 중 툴체인에 가장 맞을 최신 버전 lib를 넣는다
    • 용량 작은 .lib : dll import용. dll 안에 무슨 함수 있는지 적혀있다.
    • 용량 큰 .lib : 컴파일 타임에 코드가 포함되므로 런타임에 dll 필요 없다.
  • Visual Studio 프로젝트 우클 > 속성 > C/C++ > 일반 > 추가 포함 디렉토리
  • 아까 넣어놨던 include 디렉토리의 상대 경로 복붙
    • $(SolutionDir), $(ProjectDir) 등 Visual Studio 내장 매크로 이용
    • 매크로 뒤에 \ 또 쓸 필요 없다
  • 상단 Configuration(구성), Platform 설정 (모든 구성 설정해야 전부에 적용됨)
  • ide의 컴파일 설정 확인
  • 이제 include <GLFW/glfw3.h> 해도 에러 안 뜬다
  • header 가져와도 아직 함수 사용하면 빌드 실패한다
  • 솔루션 우클 > 속성 > 링커 > 일반 > 추가 라이브러리 디렉토리
  • GLFW 폴더의 lib 폴더 디렉토리의 상대 경로 입력
  • 속성 > 링커 > 입력 > 추가 종속성
  • glfw.lib 추가 후 세미콜론으로 구분
  • 이제 빌드 할 수 있다
    • 헤더 파일 지우고 함수 선언 대신 해도 빌드 됨. 즉, 헤더는 함수 선언들.

include<dd> 해야 하는가 include"dd.h" 해야 하는가?

  • 둘 다 차이는 없다. 따옴표 써도 상대 경로에 없으면 컴파일러에 포함된 파일들 확인한다.
  • 솔루션 안에 실제 파일이 있으면 따옴표, 완전히 외부 의존성이면 브라켓 사용한다.


profile
너 정말 **핵심**을 찔렀어

0개의 댓글