이하는 javawork님의 글입니다.

0.6.5 버젼 릴리즈 했습니다. 2009 12월에 0.6.0버젼을 릴리즈 했으니 8개월만이군요.

이전 버젼에 비해 안정성이 향상되었습니다.

다음은 세부 개선사항입니다.

* VS2010
지원
* Reactor
안정화
* StressTestClient
예제 추가
http://groups.google.com/group/halfnetwork/browse_thread/thread/a7629a9c572faa84
* Accept
IP가 제대로 전달되지 않던 버그 수정
http://groups.google.com/group/halfnetwork/browse_thread/thread/93824b63b00c08d2
* Proactor
에서 작은 패킷을 빈번하게 전송시 패킷이 누락되던 버그 수정
http://groups.google.com/group/halfnetwork/browse_thread/thread/0fc838f5fe9b316b
*
좀비 소켓 접속 해제 기능 추가
http://groups.google.com/group/halfnetwork/browse_thread/thread/951bf0c0ef08f683
*
타이머 기능 추가
http://groups.google.com/group/halfnetwork/browse_thread/thread/7ef8da3d99231be7
* Proactor
에서 동기/비동기 방식 Connect 지원
http://groups.google.com/group/halfnetwork/browse_thread/thread/228cda9d33f930c3
* DB
라이브러리 추가
http://groups.google.com/group/halfnetwork/browse_thread/thread/6dba34fef5b0f50d
* Json
방식의 패킷 라이브러리 추가

 


저작자 표시
신고
by 흥배 2010.08.13 14:57

서버와 클라이언트가 연결된 상태에서 클라이언트가 socket API로 접속을 끊던가 또는 클라이언트 프로그램이 종료하면 서버는 즉시 클라이언트의 접속 해제를 감지할 수 있습니다. 그러나 클라이언트가 특수한 상황에 빠졌던가 또는 클라이언트가 인터넷 선을 뺀 경우 일정 시간이 지날 때까지 서버에서는 접속이 끊어진 것을 감지할 수 없습니다.

이런 경우 socket API 옵션의 ‘KeepAlive’를 사용할 수도 있지만 대부분 서버와 클라이언트간에 주기적으로 패킷을 주고 받으면서 연결이 제대로 되어 있는지 확인을 합니다. 보통 이런 기능을 ‘HeartBeat’ 기능이라고 부릅니다.

 

HalfNetwork‘HeartBeat’와 같은 기능을 하는 것이 추가 되었습니다.

TestServer의 코드를 보면 서버의 환경 설정에서 config.ZombieConnectionTerm 라는 것을 볼 수 있습니다. 이것은 ZombieConnectionTerm에 설정한 시간까지 클라이언트가 패킷을 보낸 적이 없으면 접속을 끊어버립니다.

ZombieConnectionTerm의 값은 밀리세컨드 단위를 사용합니다. 그리고 0을 설정하면 사용하지 않은 것으로 설정됩니다.

 

 

저작자 표시
신고
by 흥배 2010.06.21 08:30

Proactor 방식에서 Connect를 하면 접속과 동시에 접속을 끊는 문제가 있었습니다. 이것은 앞서 이야기 했듯이 ACE VC++ 10의 문제입니다. 현재 ACE가 아직 VC++ 10을 지원하지 않고 있는 상황이라서 HalfNetwork에서는 동기 방식의 Connect 기능을 추가하여 문제를 일단 해결했습니다.

 

VC++ 9, 8 등에서는 기존과 같이 비동기나 동기 방식 어느 것이나 사용해도 괜찮지만 VC++ 10에서는 꼭 동기 방식의 Connect를 사용해야 합니다.

 

NetworkInstance에서 AsynchConnect 사용하면 비동기 연결을 사용하고, Connect를 사용하면 동기 연결을 사용합니다. 혼용하여 사용해도 괜찮습니다.

참고로 Proactor 에서는 비동기, 동기 연결을 선택할 수 있지만 Reactor에서는 동기 연결만을 사용할 수 있습니다.

 

저작자 표시
신고
by 흥배 2010.06.19 01:53

현재 HalfNetwork의 일부 기능이 VC++ 10과 문제가 있습니다.

HalfNetwork에 있는 테스트 서버와 클라이언트를 VC++ 10에서 빌드 후 실행 해보면 접속과 동시에 접속이 끊어집니다( 제 기억으로는 Beta1까지는 문제가 없었던 것 같습니다..).

 

이 문제에 대해서 Javawork님께 물어본 결과 정확하게는 HalfNetwork의 문제이기 보다는 ACE VC++ 10의 문제라고 합니다.

 

문제의 부분은 Proactor 방식에서 Async(비동기) 방식으로 Connect를 하면 접속과 동시에 끊어집니다. ACE에서도 동일한 문제가 발생하고 있다고 합니다.

 

현재 해결 방법은 VC++ 10을 사용하지 않던가(다른 버전에서는 문제가 없습니다), VC++ 10을 사용하는 경우Proactor 방식으로 사용하는 경우 Connect를 사용하지 말아야 합니다.

 

클라이언트에서 HalfNetwork를 사용하는 경우는 Reactor 방식을 사용해도 충분하기 때문에 큰 문제가 없지만 서버의 경우는 Proactor 방식을 사용해야 하는데, 서버 대 서버끼리 연결을 해야 하는 경우가 있기 때문에 VC++ 10을 사용하는 경우는 꽤 문제가 크다고 생각합니다.

 

해결 방법은 두 가지가 있는 것 같습니다. 하나는 ACE 라이브러리를 만드는 측에서 이 문제를 해결해주는 것으로 그러면 자동으로 해결 됩니다. 두 번째는 HalfNetwork에서 Proactor 방식을 사용하여 Connect를 할 때 동기 방식으로 연결할 수 있는 기능을 제공하는 것입니다.

 

위에 제가 언급한 두 개의 방법 중 해결책이 나올 때까지 서버 대 서버가 연결되는 구조의 서버를 만드는 경우는 VC++ 10으로는 HalfNetwork를 사용하지 않는 것이 좋습니다.

 

저작자 표시
신고
by 흥배 2010.06.13 20:08
아래는 Javawork님이 구글 그룹스에 올린 글입니다.
(  http://groups.google.co.kr/group/halfnetwork?hl=ko )

AddTimer 메소드를 사용하면 타이머 기능을 사용할 수 있습니다.
bool AddTimer(uint32 timerID, uint32 interval, uint32 start = 0);
interval은 타이머의 주기(ms), start는 최초에 몇 ms후에 불릴지를 결정하는 인자 입니다.
start는 스킵하면 interval과 같은 값으로 설정됩니다.

예를 들어 아래와 같이 설정하면
NetworkInstance->AddTimer(100, 2000);
eMH_Timer 값이 2초에 한번씩 Queue에 넣어집니다.

TimerID는 postee.stream_id값으로 식별이 가능합니다.
특정 QueueID로만 PopMessage(혹은 PopAllMessage)를 하고 있으면 타이머 이벤트를 받을수 없습니다.

* QueueID 인자 없는 PopMessage(혹은 PopAllMessage) 함수를 사용하거나
* TimerQueueID로 PopMessage(혹은 PopAllMessage) 를 해야

타이머 이벤트를 받을수 있습니다.
TestServer 예제를 참고하시면 사용예가 있습니다.
또 하나의 변경 사항은 예전에는 QueueID 인자 없는 PopAllMessage를 사용하면
Queue에서 가져올게 없어도 cpu 사용률이 증가하는 현상이 있었는데 이번에 수정되었습니다.
여러개의 Queue를 하나의 이벤트 객체를 통해 감시 할수 있는 코드를 추가했기 때문입니다.
저작자 표시
신고
by 흥배 2010.06.13 19:56
HalfNetwork를 만드신 영기님을 도와서 저는 문서화 작업을 해 볼려고 하는데
가장 원하는 것이 어떤 부분의 문서화인지 궁금합니다.

아무래도 저는 영기님을 통해서 이전부터 HalfNetwork에 대한 설명을 들어서 
HalfNetwork를 처음 접하시는 분들이 어떤 부분이 사용하는데 불편함을 느끼는지 잘 모릅니다.
그러니 HalfNetwork를 사용하면서 이런 부분의 문서화가 있으면 좋겠다라고 생각하는 부분이 있으면
알려주시기 바랍니다.

그리고 HalfNetwork를 사용하면서 궁금한 점이나 버그를 발견하면
구글의 HalfNetwork 그룹스에 가입 후 글을 올려주시면 가장 빨리 답변을 얻을 수 있습니다.
http://groups.google.co.kr/group/halfnetwork?hl=ko

저작자 표시
신고
by 흥배 2010.05.12 08:30

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 2 3 |

티스토리 툴바