ReturnType (*functionPointerVariableName)(paramter, ...); // variable type
typedef ReturnType (*functionPointerTypeName)(paramter, ...); // Type type
functionPointerTypeName var = functionName;
var(param, ...);
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에서 제공하는 간단한 방법
기존 함수포인터는 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 없이 호출 가능
Thread와 Non Blocking를 사용하지 않고 Socket 통신을 처리하는 방법
WindowProceduralMessage를 통해 Socket의 read, write를 처리하는 방법
FD_CONNECT, FD_READ, FD_WRITE, FD_CLOSE
connect 후 소켓이 처음 연결되었을 때
accept 후 소켓이 처음 연결되었을 때
send를 호출해서 WSAEWOULDBLOCK이 리턴된 후 write buffer가 비워졌을 때
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))
{
...
}
}
함수 호출 시점에 Write Buffer가 가득 차지 않았는가
Select 모델의 경우 최대 64개의 socket만 연결이 가능하고, Server side라면 listen socket을 포함하여 최대 63개의 socket이 연결 가능하니 대형 Server에서는 사용하기 힘듬
IOCP나 RIO Server를 사용하는 것이 가장 좋다고 하는데...
Server의 Runtime 상황에서 Memory를 동적으로 생성-삭제를 하는 경우 fragmentation을 일으킬 위험이 높음
가능하면 std를 통한 메모리 관리나 copy, 동적 할당이 아닌 Memory Object Pool을 이용한 메모리 관리 방식을 추천