private void ProcessSend()
{
lock (_sendPacketQueue)
{
while (_sendPacketQueue.Count > 0)
{
// 큐에서 보낼 패킷을 얻어 바이트 스트림 구성
object packet;
{
packet = _sendPacketQueue[0];
_sendPacketQueue.RemoveAt(0);
}
if (packet == null)
{
_client.Client.Shutdown(SocketShutdown.Send);
break;
}
int length;
using (var ms = new MemoryStream())
{
_packetSerializer.Serialize(ms, packet);
length = (int)ms.Length;
if (length > _sendBuf.Length)
{
_logger?.ErrorFormat("ProcessSend got too large packet. Length={0}", length);
Close();
return;
}
Array.Copy(ms.GetBuffer(), _sendBuf, length);
}
// 전송
try
{
_sendProcessing = true;
_client.GetStream().BeginWrite(_sendBuf, 0, length, ProcessSendCallback, null);
break;
}
catch (Exception e)
{
_logger?.Trace("ProcessSend Exception", e);
break;
}
}
}
}