그러던 중에 수신 측에서 패킷 순서가 뒤바뀌는 현상이 발생되더군요.
그 원인을 찾아보니 Send_Mode 를 HalfNetwork::eSM_Direct 으로 설정했을 때 이상한 부분이 보입니다.
내부적으로 DirectProactorSend::Send() 를 통해서 전송하는데, 여기서
ProactorService::DirectSend() 를 호출하고 있습니다.
그리고, 거기서는 ProactorService::_SmartSend() 를 호출하고 있습니다.
bool ProactorService::_SmartSend(ACE_Message_Block* block)
{
if (false == _serviceImpl->AcquireSendLock())
{
return _PushQueue(block, 0);
}
//ACE_DEBUG (( LM_INFO, ACE_TEXT("_%d_ SmartSend : Length(%d)"),
_serial, block->length()));
if (false == _SmartSendImpl(block))
{
//block->release(); 에러가 발생하더라도, 메모리는 해제되었음
ReserveClose();
return false;
}
return true;
}
문제는 연속으로 SendRequest() 호출할 경우에 간헐적으로 _serviceImpl->AcquireSendLock() 호출
에서 false 가 발생하여 큐에 패킷을 쌓아두게 됩니다. 이럴 경우에 패킷 전송 순서가 뒤바뀝니다.
ACE_Message_Block 의 priority 와는 관계 없이 패킷 전송 순서가 뒤바뀌는 것이지요.
HalfNetwork::eSM_Direct 일 경우에는
bool ProactorService::_SmartDirectSend(ACE_Message_Block* block)
{
if (false == _SmartSendImpl(block))
{
//block->release(); 에러가 발생하더라도, 메모리는 해제되었음
ReserveClose();
return false;
}
return true;
}
위와 같이 해야하지 않을까 생각이 듭니다만, 개발자님 생각은 어떠하신지요?