프로그램이 수행해야 할 일서버클라이언트로부터 메세지를 수신해서 다른 클라이언트들에게 뿌려주는 단순한 echo 기능을 수행한다.클라이언트콘솔 화면에서 메세지를 입력받아서 서버로 송신하며, 동시에 서버에서 수신받은 메세지를 화면에 출력한다. 서버리눅스에도 있는 select를 사용해서 각 소켓의 메세지를 수신하고 송신할 수 있지만 winsock에서는 더 사용하기 편하고 강력한 기능을 제공하는 WSAEventSelect를 사용하기로 한다. 클라이언트서버에서 WSAEventSelect를 사용하여 멀티플렉싱을 구현하였기 때문에 클라이언트에서도 해당 함수를 사용해서 stdin과 소켓의 멀티플렉싱을 구현하려 했으나 windows는 socket과 file을 다르게 관리하기 때문에 위 함수를 사용할 수 없었다.아래는 멀티..
소켓 통신에 대해 공부를 하고 windows환경에서 개발을 하려고 보니 리눅스 소켓과 윈도우 소켓은 많이 다르다는 것을 알게 되었다.그중 하나가 리눅스에서 멀티플렉싱(Multiplexing)을 위해 사용하던 select를 윈도우에서 그대로 사용할 수 없다는 것이다. Multiplexing하나의 프로세스가 하나의 전송로를 사용해서 여러 사용자들과 통신하여 효율성을 높이는 기술 리눅스에서는 멀티플렉싱을 구현하기 위해 select 함수를 사용하였다. int select(int nfds, // 최대 소켓 번호+1fd_set* read_fds, // 읽기를 감지할 fdsfd_set* write_fds, // 쓰기를 감지할 fdsfd_set* error_fds, // 예외를 감지할 fdsstruct timeval*..
소켓으로 통신을 하다가 통신을 끝내고 싶을 때 소켓을 종료해야한다.소켓을 종료하는 방법은 두가지가 있는데 int close(int socket_fd);int shutdown(int socket_fd, int how_to); 이 있다. 위 두가지 함수의 사용법과 차이점에 대해 알아보자 TCP소켓은 통신의 신뢰성을 유지하기 위해 패킷을 주고받을 때 마다 안전하게 수신했다는 신호로 ACK패킷을 재전송한다. 이는 소켓을 종료할 때도 마찬가지이며 클라이언트에서 종료 패킷을 보내면 서버는 이에 따른 ACK패킷과 종료 패킷을 보낸다. 서버가 보낸 종료 패킷에 대해 클라이언트도 ACK패킷을 전송하면 정상적으로 소켓이 종료된다. close() int close(int socket_fd); 성공하면 0을, 실패하면 -1을..
서버가 여러 클라이언트를 처리하기 위한 방법 중 입출력 다중화를 사용하는 방법을 알아보자.입출력 다중화란 여러 입출력 대상이 있을 때 그 대상들을 검사하며 입출력이 필요할 때마다 작업을 수행하는 것을 말한다. 이 방법은 멀티 프로세싱, 멀티 스레딩 방법과 다르게 싱글 프로세스, 싱글 스레드에서도 동작한다. 하지만 완전히 동시에 처리하지는 못하는 단점을 가지고 있다. select() 함수리눅스는 select() 함수로 입출력 다중화를 구현할 수 있다. select()는 지정한 범위의 file discripter중 FD_SET으로 1로 set되어있는 파일을 순회하면서 변화가 있는 file discripter를 반환한다.파일에 변화가 있다면 그대로 1로 두고, 변화가 없다면 0으로 set멀티 플랙싱이 가능하게..
어떤 프로그래밍 책에서 #pragma instrinsic 명령으로 math.h 내에 있는 함수들의 속도를 향상시킬 수 있다는 내용을 읽었다 책에서는 그냥 instrinsic을 사용하면 속도가 향상된다고 쓰여 있었고 삼각함수를 빨리 구하기 위해 삼각함수 table을 사용하는 방법도 intrinsic(cos, sin, tan)을 하면 소용이 없다 라는 뉘앙스의 설명이 있었다 #pragma intrinsic이 대체 뭐길래 이런 마법같은 일을 하는 것일까 #pragma 명령 전저리기 명령. 사전에 컴파일러에게 명령을 내릴 수 있다. #pragma intrinsic 사용법 #pragma intrinsic(func1, func2, ...) 설명 인자 목록에 들어있는 함수를 컴파일러가 판단한 후 inline 또는 f..
스케줄러란?일정 시간 후에 콜백 함수를 실행하거나 일정 시간마다 콜백 함수를 실행하게 하는 루프 코드 // selector, interval, repeat, delay// if repeat is -1 repeat foreverthis->schedule(schedule_selector(ClassName::FuncName), 1.0f, 2.0f, 3.0f); schedule_selector라는 메크로는 함수포인터를 통해 콜백함수를 등록한다. 콜백함수는 float 형의 dt 매개변수를 가지고 있어야 한다.
RenderTexture란?렌더링을 할 수 있는 텍스처로 Cocos2d-x 에서 필요한 크기만큼 생성하여 그 위에 그리고 싶은 오브젝트들을 그릴 수 있다. 만들어진 texture에 shader를 적용시켜서 광원 효과를 내거나 작은 renderTexture를 생성해서 미니맵 같은 요소를 만들 수 있다. RenderTexture 생성 auto renderTexture = RenderTexture::create(100, 100, Texture2D::PixelFormat::RGBA8888); // width, height, pixelFormat this->addChild(renderTexture); RenderTexture에 sprite 추가 auto spr = Sprite::create("image.png")..
개발을 하다보면 한 객체가 다른 객체를 자식으로 가지는 계층 구조를 많이 만들게 되는데 이 계층화된 객체를 메모리에서 삭제(remove)시키려면 최상위 객체만 부모 레이어로부터 remove시키면 된다.임의로 최상위 객체의 소멸자에서 removeAllChildren()같은 함수를 추가하면 나중에 레이어를 삭제할 때 문제가 발생할 수 있다. 문제 발생 시나리오레이어 A에 Sprite객체 head와 SpriteBatchNode headBatch, bodyBatch가 추가되어 있고, head는 자식으로 body와 arm을 가지고 있다. 이 때 arm과 body의 이미지는 head이미지를 가지고 있는 plist와 다른 plist에 있으므로 객체 head를 생성할 때 bodyBatch를 전달하여 body와 arm을..
- Total
- Today
- Yesterday
- 국내여행
- SHADER
- C
- ue4
- Cocos2d-x
- JSP
- Java
- 수학
- DesignPattern
- 드라마
- game
- mongoDB
- rxswift
- Git
- ios
- SOCKET
- winsock
- 알고리즘
- database
- swift
- OS
- scala
- 운영체제
- C++
- 데이터베이스
- C/C++
- 자료구조
- machine learing
- SwiftUI
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |