If a packet pooling blows up, fail gracefully instead of disconnecting

the user
0.6.5-rc1
Melanie Thielker 2009-05-02 21:21:20 +00:00
parent 780f34275b
commit 229a4d54ca
1 changed files with 33 additions and 21 deletions

View File

@ -26,12 +26,14 @@
*/ */
using System; using System;
using System.Reflection;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net.Sockets; using System.Net.Sockets;
using System.Threading; using System.Threading;
using System.Timers; using System.Timers;
using OpenMetaverse; using OpenMetaverse;
using OpenMetaverse.Packets; using OpenMetaverse.Packets;
using log4net;
using OpenSim.Framework; using OpenSim.Framework;
using Timer=System.Timers.Timer; using Timer=System.Timers.Timer;
@ -39,8 +41,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{ {
public class LLPacketHandler : ILLPacketHandler public class LLPacketHandler : ILLPacketHandler
{ {
//private static readonly ILog m_log private static readonly ILog m_log
// = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//private int m_resentCount; //private int m_resentCount;
@ -768,28 +770,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (packet is KillPacket) if (packet is KillPacket)
Abort(); Abort();
// Actually make the byte array and send it try
byte[] sendbuffer = item.Packet.ToBytes();
//m_log.DebugFormat(
// "[CLIENT]: In {0} sending packet {1}",
// m_Client.Scene.RegionInfo.ExternalEndPoint.Port, packet.Header.Sequence);
if (packet.Header.Zerocoded)
{ {
int packetsize = Helpers.ZeroEncode(sendbuffer, // If this packet has been reused/returned, the ToBytes
sendbuffer.Length, m_ZeroOutBuffer); // will blow up in our face.
m_PacketServer.SendPacketTo(m_ZeroOutBuffer, packetsize, // Fail gracefully.
SocketFlags.None, m_Client.CircuitCode); //
// Actually make the byte array and send it
byte[] sendbuffer = item.Packet.ToBytes();
if (packet.Header.Zerocoded)
{
int packetsize = Helpers.ZeroEncode(sendbuffer,
sendbuffer.Length, m_ZeroOutBuffer);
m_PacketServer.SendPacketTo(m_ZeroOutBuffer, packetsize,
SocketFlags.None, m_Client.CircuitCode);
}
else
{
// Need some extra space in case we need to add proxy
// information to the message later
Buffer.BlockCopy(sendbuffer, 0, m_ZeroOutBuffer, 0,
sendbuffer.Length);
m_PacketServer.SendPacketTo(m_ZeroOutBuffer,
sendbuffer.Length, SocketFlags.None, m_Client.CircuitCode);
}
} }
else catch (NullReferenceException)
{ {
// Need some extra space in case we need to add proxy m_log.Debug("[PACKET] Detected reuse of a returned packet");
// information to the message later m_PacketQueue.Cancel(item.Sequence);
Buffer.BlockCopy(sendbuffer, 0, m_ZeroOutBuffer, 0, return;
sendbuffer.Length);
m_PacketServer.SendPacketTo(m_ZeroOutBuffer,
sendbuffer.Length, SocketFlags.None, m_Client.CircuitCode);
} }
// If this is a reliable packet, we are still holding a ref // If this is a reliable packet, we are still holding a ref