✅ 한 것들
- 넥토리얼 코테 : 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";
char *serv_port = "9190";
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(serv_ip);
addr.sin_port = htons(atoi(serv_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" 해야 하는가?
- 둘 다 차이는 없다. 따옴표 써도 상대 경로에 없으면 컴파일러에 포함된 파일들 확인한다.
- 솔루션 안에 실제 파일이 있으면 따옴표, 완전히 외부 의존성이면 브라켓 사용한다.