PopAllMessage를 호출하여 받는 메시지 블록을 호출할 때마다 동적 생성하지 않고 미리 메모리 풀을 만들어서 재사용할 수 있습니다.

 

메모리 블록의 풀의 크기와 개수는 아래의 함수로 설정합니다.

 

void PrepareMemoryBlock( const size_t bufferSize, const uint32 count );

// 64 byte짜리 청크를 100개 미리 할당
PrepareMemoryBlock(64, 100);



그런데 서버 실행 중 64보다 큰 200 바이트 크기의 메시지 블록이 필요하게 되면 풀에서는 200 바이트로 재할당 합니다( 정확하게는 100 이라고 설정하면 128, 200 이라면 256 바이트 청크를 만듭니다 ).

 

또 미리 할당한 청크를 다 사용하였다면 앞에 할당한 개수의 2배로 재할당 합니다.

 

 

by 흥배 2010.02.08 09:00

PopAllMessage 호출 시 세 번째 파라미터를 -1이 아닌 값을 설정하였다면 서버가 종료할 때 설정한 값이 지난 후 스레드가 깨어난 후 스레드가 종료됩니다.

 

그러나 -1로 설정했다면 무한 대기에 빠집니다. 서버 종료 시에 무한 대기에 빠지지 않기 위해서는 서버 종료 시에

NetworkInstance->Pulse();

을 호출하여 스레드를 깨워야 서버를 정상적으로 종료할 수 있습니다.

by 흥배 2010.02.04 09:00

0.60 버전에서 추가된 기능으로 설정파일을 읽을 수 있습니다.



설정파일 이름

const wchar_t CONFIG_FILE_NAME[] = L"TestClientConfig.txt";

 

설정 파일에 있는 내용

server_port=15001;

client_port=25001;

workerthread=0;

receivebufferlength=2048;

updateterm=20;

 

server_receive_buff_size=65536;

client_receive_buff_size=4096;

 

client_init_accept_count=126;

 

 

사용


SimpleConfig configReader;

 

if( false == configReader.ReadFile( CONFIG_FILE_NAME ) )

{

        return false;

}

 

HalfNetwork::SystemConfig config;

config.Worker_Thread_Count = configReader.GetValue<unsigned char>(ACE_TEXT("workerthread"));



 
by 흥배 2010.02.03 09:00

네트웍을 통해서 받은 데이터를 담을 버퍼의 크기를 설정하는 방법은 두 가지가 있습니다.

하나는 SystemConfig 객체 사용하는 것 , 또 다른 하나는 Acceptor를 설정할 때 파리미터로 버퍼의 크기를 설정합니다.




1. SystemConfig


HalfNetwork::SystemConfig config;

config.Receive_Buffer_Len = 1024;

 

 

2. Acceptor에서 설정

NetworkInstance->AddAcceptor( NULL, 6555, CLIENT_QUEUE_ID, 2048, ClientInitAcceptCount ))

                                



주의해야 할 점은 1번에서 설정한 후 2번을 통해서 또 설정하는 경우 2번으로 설정한 것을 우선 시 합니다.
by 흥배 2010.02.01 09:00
랜 카드가 1개 있다는 가정하에서….

#include <ws2tcpip.h>

bool ServerInfoMgr::GetLocalIP( string& strIP )
{
    char host_name[256];
    if (gethostname(host_name, 256) == SOCKET_ERROR)
         return false;

   struct addrinfo hints, *res = NULL;
   char *szRemoteAddress=NULL, *szRemotePort=NULL;
   int rc; memset( &hints, 0, sizeof(hints) );
   hints.ai_family = AF_INET;
   hints.ai_socktype = SOCK_STREAM;
   hints.ai_protocol = IPPROTO_TCP;

   rc = getaddrinfo( host_name, szRemotePort, &hints, &res );
   if( rc == WSANO_DATA ) { return false; }

   char szIP[MAX_IP_STRING_LENGTH] = {0, };
   sprintf_s( szIP, MAX_IP_STRING_LENGTH, "%d.%d.%d.%d",
               (unsigned char)res->ai_addr->sa_data[2],
              (unsigned char)res->ai_addr->sa_data[3],
              (unsigned char)res->ai_addr->sa_data[4],
              (unsigned char)res->ai_addr->sa_data[5] );
             
   strIP = szIP;
   return true;
}

by 흥배 2009.12.07 08:30
| 1 2 |