제 개발환경은 windows7- VS2008 환경에 Proactor를 사용하였습니다.
컴파일은 win32플랫폼에 사용소스는 SVN 최신 소스를 사용하였습니다.
여러가지는 아니지만..^^;; 몇가지를 테스트 해봤는데요..
<TestClient>
void NetworkThread::_OnConnect(unsigned int streamID, const char* ip)
{
//ACE_DEBUG ((LM_DEBUG, "[%t] OnConnect(%d).\n", streamID));
//SendDummyData(streamID);
Sleep(1000);
char sbuffer[50] = {0, };
strcpy(sbuffer,
"abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde");
for(int i = 0; i < 300; ++i)
NetworkInstance->SendRequest(streamID, sbuffer, 50);
Sleep(1000);
for(int i = 0; i < 300; ++i)
NetworkInstance->SendRequest(streamID, sbuffer, 50);
}
이런식으로 하고 OnRead 부분은 주석처리 했고요
<TestServer>
void OnRead(unsigned int streamID, char* buffer, unsigned int length)
{
static int recv_outer_size = 0;
recv_outer_size += length;
HALF_LOG(ConsoleLogger, ACE_TEXT("cur_Outer_Recv_Size : %d\n\r"),
recv_outer_size);
}
이런식으로 하고 OnAccept 안은 주석처리 하고 사용해봤습니다.
문제는 PopMessage로 사용하였을때에도 똑같은 현상이 발생하였습니다.
똑같이 Stress Client에서도
<Stress Client>
void SendThread::Update()
{
_ioStatus->Print();
if ((unsigned int)_ioStatus->GetSentBytes() >= _aimSendByte)
{
EventSleep(1000);
return;
}
char buffer[1024] = {0,};
unsigned int sendSize = rand()%50 + 4;
MakeRandomBuffer(buffer, sendSize);
ACE_Message_Block* block;
unsigned int streamId = 0;
for(int i = 0; i < 300; ++i)
{
block = new ACE_Message_Block(sendSize);
block->copy(buffer, sendSize);
if (NetworkInstance->SendRequest(streamId, block, false))
_ioStatus->AddSendBytes(sendSize);
else
printf("SendRequest fail.");
}
EventSleep(30);
}
<TestServer>
void OnRead(unsigned int streamID, char* buffer, unsigned int length)
{
HALF_LOG (ConsoleLogger, ACE_TEXT("OnRead(%d, %d)."), streamID,
length);
ACE_Message_Block* block = NetworkInstance->AllocateBlock(length);
block->copy(buffer, length);
NetworkInstance->SendRequest(streamID, block);
}
를 했을때 되돌려받는 패킷에서 차이가 났습니다.^^
원인은 아직 찾지는 못했습니다.^^;;;
하지만 Sleep을 1이라도 걸어주면 정상적으로 돌아갑니다.