ProactorService::DirectSend() 와 패킷 전송 순서에 대해서

48 views
Skip to first unread message

ened

unread,
Mar 5, 2012, 9:51:17 PM3/5/12
to HalfNetwork
현재 패킷 메시지를 각각 따로 만들어서 NetworkFacade::SendRequest() 를 이용하여 전송하고 있었습니다.

그러던 중에 수신 측에서 패킷 순서가 뒤바뀌는 현상이 발생되더군요.

그 원인을 찾아보니 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;
}

위와 같이 해야하지 않을까 생각이 듭니다만, 개발자님 생각은 어떠하신지요?

Reply all
Reply to author
Forward
0 new messages