Everything in C++ 98.
엔디안 변환 함수
바이트 저장 방식에 따라 CPU마다 차이가 발생하는데,
가장 낮은 바이트를 맨 앞에 저장하는 것을 리틀 엔디안 방식이라고 하고
가장 높은 바이트를 맨 앞에 저장하는 것을 빅 엔디안 방식이라고 한다.
서로 다른 저장방식을 사용하는 시스템끼리 통신을 하게 되면 원치 않는 값을 주고받을 수 있다. 그래서 이런 문제를 해결하기 위해 데이터 통신을 할때는 명시적으로 네트워크 byte order를 따르도록 데이터 byte order를 변경해주어야 한다.
네트워크 바이트 정렬은 빅 엔디안 방식이다. (호스트는 리틀 엔디안.)
아래 함수들은 byte order방식을 바꾸어 준다.
- htons - 2byte 데이터(short)를 빅 엔디안으로 변환해준다.
- htonl - 4byte 데이터(long)를 빅 엔디안으로 변환해준다.
- ntohs - 2byte 데이터(short)를 리틀 엔디안으로 변환해준다.
- ntohl - 4byte 데이터(long)를 리틀 엔디안으로 변환해준다.
system call
select, poll, epoll, kqueue
시스템 콜 함수들은 설명하기 너무 어려워, 다른 사이트 글들로 대체
select는 너무 구식이니 poll 혹은 select의 강화버전인 epoll 사용하는 것을 추천한다.
soket
클라이언트-서버 환경 생성 흐름
- socket()으로 소켓 생성.
- bind()로 소켓 주소 할당.
- listen()으로 클라이언트의 연결 대기.
- accept()로 클라이언트의 연결 수신.
- 그후 요청 처리.
- socket()으로 소켓 생성.
- connect()로 서버 연결 시도.
- 요청 메시지 전달.
socket
int socket(domain, type, protocol);
소켓을 만들기 위한 함수
- domain - 프로토콜 체계
- PF_INET - 인터넷 체계 사용
- PF_UNIX - UNIX방식 체계 사용
- PF_NS - XEROX 방식 체계 사용
- TCP/IP 사용하려면 인터넷 체계인 PF_INET를 사용해야한다.
- type - 서비스 타입
- SOCK_STREAM - 스트림 방식 (연결형. TCP)
- SOCK_DGRAM - 데이터 그램 방식 (비연결형. UDP)
- protocol - 소켓을 지원하는 프로토콜
- accept - 연결처리 함수. 연결형 소켓타입에 사용된다.
- 블록함수기 때문에 연결 요청이 들어올떄까지 리턴하지 않고 대기함.
- listen - 연결 대기 함수.
- send - 소켓에 데이터를 전송하는 함수.
- recv - 소켓으로부터 데이터를 수신받는 함수.
- bind - 소켓에 주소할당해주는 함수.
- connect - 연결요청 함수. 클라이언트 -> 서버 연결요청할때 사용.
- inet_addr - IPv4 주소를 빅 엔디안으로 변환해주는 함수.
- setsockopt - 소켓 속성값 변환 함수.
- getsockname - 소켓 정보(주소)를 가져오는 함수.
- fcntl - 파일의 속성을 얻거나 변경하는 함수.
학습에 참고한 사이트