diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index e29ec4ee4e..3b9d293bb4 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -291,48 +291,43 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
private void BeginRobustReceive()
{
- try
+ bool done = false;
+
+ while (!done)
{
- BeginReceive();
+ try
+ {
+ BeginReceive();
+ done = true;
+ }
+ 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.
+
+ try
+ {
+ CloseCircuit(e);
+ }
+ 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;
+ }
}
- 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.");
- }
}
- ///
- /// Reset the server endpoint
- ///
- ///
- /// The exception that has triggered the reset. Can be null if there was no exception.
- ///
- private void ResetServerEndPoint(Exception e)
- {
- try
- {
- CloseCircuit(e);
- }
- catch (Exception e2)
- {
- m_log.ErrorFormat(
- "[CLIENT]: Exception thrown when trying to close the circuit for {0} - {1}", reusedEpSender, e2);
- }
-
- // ENDLESS LOOP ON PURPOSE!
- // 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!
- BeginRobustReceive();
- }
-
///
/// Close a client circuit. This is done in response to an exception on receive, and should not be called
/// normally.