01.10

신승빈·2023년 1월 10일
0

KGCA 수업

목록 보기
92/128

Callback

C Function Pointer

ReturnType (*functionPointerVariableName)(paramter, ...);			// variable type
typedef ReturnType (*functionPointerTypeName)(paramter, ...);		// Type type

functionPointerTypeName var = functionName;
var(param, ...);

Classical C++ Function Pointer

C++은 C에 class라는 개념이 추가되어 class member function에 대한 함수 포인터 역시 사용 가능

ReturnType (ClassName::*functionPointerVariableName)(parameter, ...)		// variable type
typedef ReturnType (ClassName::*functionPointerTypeName)(parameter, ...)	// Type type

functionPointerTypeName var = &ClassName::FunctionName;
(ClassInstance.*var)(parameter, ...);		// self reference를 통해 접근해야 함

std::function

복잡한 기존 함수포인터 사용법 대신 std에서 제공하는 간단한 방법
기존 함수포인터는 Class type에 한정되었지만, std::function은 반환 형식과 매개변수만 일치한다면 Class type에 무관한 형태로 사용 가능

std::function<ReturnType(paramter, ...)> functionPointerVariableName;	// variable type
typedef std::function<ReturnType(paramter, ...)> functionPointerTypeName;	// Type type

functionPointerTypeName var = std::bind(functionName, selfReferece, std::placeholders::_1, ...);
var(parameter, ...);	// bind에서 self reference를 묶어줬으므로 self reference 없이 호출 가능
Reference : https://modoocode.com/254

Select 계열 입출력 모델

Thread와 Non Blocking를 사용하지 않고 Socket 통신을 처리하는 방법

Reference : https://dbehdrhs.tistory.com/84

WSAAsyncSelect

WindowProceduralMessage를 통해 Socket의 read, write를 처리하는 방법
FD_CONNECT, FD_READ, FD_WRITE, FD_CLOSE

FD_write가 발생하는 경우

connect 후 소켓이 처음 연결되었을 때
accept 후 소켓이 처음 연결되었을 때
send를 호출해서 WSAEWOULDBLOCK이 리턴된 후 write buffer가 비워졌을 때

Select

FD_SET에 Socket을 등록한 후 Set에 등록된 socket 중 RWE가 발생한 Socket이 있으면 작업 수행

FD_ZERO(FD_RWESet);				// 초기화
FD_SET(socket, FD_RWESet);		// 등록

timeval timeOut;
timeOut.tv_sec = n;	// second
timeOut.tv_usec = m;	// micro second
select(0, FD_ReadSet, FD_WriteSet, FD_ErrorSet, &timeOut);

for(auto socket : sockets)
{
	if(FD_ISSET(socket, FD_RWESet))
    {
    	...
    }
}

FD_WriteSet

함수 호출 시점에 Write Buffer가 가득 차지 않았는가

IOCP, RIO Server

Select 모델의 경우 최대 64개의 socket만 연결이 가능하고, Server side라면 listen socket을 포함하여 최대 63개의 socket이 연결 가능하니 대형 Server에서는 사용하기 힘듬

IOCP나 RIO Server를 사용하는 것이 가장 좋다고 하는데...

Server 설계 시 주의사항

Server의 Runtime 상황에서 Memory를 동적으로 생성-삭제를 하는 경우 fragmentation을 일으킬 위험이 높음
가능하면 std를 통한 메모리 관리나 copy, 동적 할당이 아닌 Memory Object Pool을 이용한 메모리 관리 방식을 추천

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글