private void StartSend(object packet)
{
if (!_issueCountFlag.Increment())
return;
var packetLen = Settings.PacketSerializer.EstimateLength(packet);
var tailSize = 0;
if (packetLen > _sendBuffer.Length)
tailSize = packetLen - _sendBuffer.Length;
var stream = new HeadTailWriteStream(new ArraySegment<byte>(_sendBuffer), tailSize);
try
{
Settings.PacketSerializer.Serialize(stream, packet);
}
catch (Exception e)
{
if (_logger != null)
_logger.WarnFormat("Exception raised in serializing", e);
HandleSerializeError(SerializeError.SerializeExceptionRaised);
return;
}
var streamLength = (int)stream.Length;
if (streamLength <= _sendBuffer.Length)
{
// 전송 버퍼안으로 보낼 수 있으므로 Normal 모드
_sendOffset = 0;
_sendLength = streamLength;
}
else
{
// 패킷 크기가 최대 크기보다 큰지 확인
if (streamLength > Settings.SendBufferMaxSize)
{
HandleSerializeError(SerializeError.SerializeSizeExceeded);
return;
}
// 전송 버퍼를 넘어서는 크기이므로 Large 모드로 전환
_sendOffset = 0;
_sendLength = _sendBuffer.Length;
_sendLargeBuffer = stream.Tail;
_sendLargeOffset = 0;
_sendLargeLength = streamLength - _sendBuffer.Length;
Debug.Assert(_sendLargeBuffer != null && _sendLargeLength > 0, "It should be valid");
}
IssueSend();
}