* Changed a recursive BeginRobustReceive loop to a flat while loop to avoid lethal stack overflows.

0.6.5-rc1
lbsa71 2009-03-25 19:30:36 +00:00
parent e694e1a657
commit 3cb06cc4cc
1 changed files with 33 additions and 38 deletions

View File

@ -291,46 +291,41 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// </summary> /// </summary>
private void BeginRobustReceive() private void BeginRobustReceive()
{ {
try bool done = false;
{
BeginReceive();
}
catch (SocketException e)
{
// ENDLESS LOOP ON PURPOSE!
// Reset connection and get next UDP packet off the buffer
// If the UDP packet is part of the same stream, this will happen several hundreds of times before
// the next set of UDP data is for a valid client.
ResetServerEndPoint(e);
}
catch (ObjectDisposedException)
{
m_log.Info("[UDPSERVER]: UDP Object disposed. No need to worry about this if you're restarting the simulator.");
}
}
/// <summary> while (!done)
/// Reset the server endpoint
/// </summary>
/// <param name="e">
/// The exception that has triggered the reset. Can be null if there was no exception.
/// </param>
private void ResetServerEndPoint(Exception e)
{
try
{ {
CloseCircuit(e); try
} {
catch (Exception e2) BeginReceive();
{ done = true;
m_log.ErrorFormat( }
"[CLIENT]: Exception thrown when trying to close the circuit for {0} - {1}", reusedEpSender, e2); catch (SocketException e)
} {
// ENDLESS LOOP ON PURPOSE!
// Reset connection and get next UDP packet off the buffer
// If the UDP packet is part of the same stream, this will happen several hundreds of times before
// the next set of UDP data is for a valid client.
// ENDLESS LOOP ON PURPOSE! try
// We need to purge the UDP stream of crap from the client that disconnected nastily or the UDP server will die {
// The only way to do that is to BeginRobustReceive again! CloseCircuit(e);
BeginRobustReceive(); }
catch (Exception e2)
{
m_log.ErrorFormat(
"[CLIENT]: Exception thrown when trying to close the circuit for {0} - {1}", reusedEpSender,
e2);
}
}
catch (ObjectDisposedException)
{
m_log.Info(
"[UDPSERVER]: UDP Object disposed. No need to worry about this if you're restarting the simulator.");
done = true;
}
}
} }
/// <summary> /// <summary>