diff options
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 103 |
1 files changed, 49 insertions, 54 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 40b4a42..52a2467 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -271,17 +271,59 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
271 | m_socket.BeginReceiveFrom( | 271 | m_socket.BeginReceiveFrom( |
272 | RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref reusedEpSender, ReceivedData, null); | 272 | RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref reusedEpSender, ReceivedData, null); |
273 | } | 273 | } |
274 | catch (SocketException) | 274 | catch (SocketException e) |
275 | { | 275 | { |
276 | // We don't need to see this error, reset connection and get next UDP packet off the buffer | ||
277 | // If the UDP packet is part of the same stream, this will happen several hundreds of times before | ||
278 | // the next set of UDP data is for a valid client. | ||
279 | //m_log.ErrorFormat("[CLIENT]: BeginRecieve threw exception " + e.Message + ": " + e.StackTrace ); | ||
280 | |||
281 | // ENDLESS LOOP ON PURPOSE! | 276 | // ENDLESS LOOP ON PURPOSE! |
282 | ResetEndPoint(); | 277 | // Reset connection and get next UDP packet off the buffer |
278 | // If the UDP packet is part of the same stream, this will happen several hundreds of times before | ||
279 | // the next set of UDP data is for a valid client. | ||
280 | ResetServerEndPoint(e); | ||
283 | } | 281 | } |
284 | } | 282 | } |
283 | |||
284 | /// <summary> | ||
285 | /// Reset the server endpoint | ||
286 | /// </summary> | ||
287 | /// <param name="e"> | ||
288 | /// The exception that has triggered the reset. Can be null if there was no exception. | ||
289 | /// </param> | ||
290 | private void ResetServerEndPoint(Exception e) | ||
291 | { | ||
292 | try | ||
293 | { | ||
294 | CloseCircuit(reusedEpSender, e); | ||
295 | } | ||
296 | catch (Exception a) | ||
297 | { | ||
298 | m_log.Error("[UDPSERVER]: " + a); | ||
299 | } | ||
300 | |||
301 | // ENDLESS LOOP ON PURPOSE! | ||
302 | // We need to purge the UDP stream of crap from the client that disconnected nastily or the UDP server will die | ||
303 | // The only way to do that is to beginreceive again! | ||
304 | BeginReceive(); | ||
305 | } | ||
306 | |||
307 | /// <summary> | ||
308 | /// Close a client circuit. This is done in response to an exception on receive, and should not be called | ||
309 | /// normally. | ||
310 | /// </summary> | ||
311 | /// <param name="sender"></param> | ||
312 | /// <param name="e">The exception that caused the close. Can be null if there was no exception</param> | ||
313 | private void CloseCircuit(EndPoint sender, Exception e) | ||
314 | { | ||
315 | uint circuit; | ||
316 | lock (clientCircuits) | ||
317 | { | ||
318 | if (clientCircuits.TryGetValue(sender, out circuit)) | ||
319 | { | ||
320 | m_packetServer.CloseCircuit(circuit); | ||
321 | |||
322 | if (e != null) | ||
323 | m_log.ErrorFormat("[CLIENT]: Closed circuit {0} {1} due to exception {2}", circuit, sender, e); | ||
324 | } | ||
325 | } | ||
326 | } | ||
285 | 327 | ||
286 | /// <summary> | 328 | /// <summary> |
287 | /// Finish the process of asynchronously receiving the next bit of raw data | 329 | /// Finish the process of asynchronously receiving the next bit of raw data |
@@ -327,53 +369,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
327 | return hasReceivedOkay; | 369 | return hasReceivedOkay; |
328 | } | 370 | } |
329 | 371 | ||
330 | private void ResetEndPoint() | ||
331 | { | ||
332 | try | ||
333 | { | ||
334 | CloseEndPoint(reusedEpSender); | ||
335 | } | ||
336 | catch (Exception a) | ||
337 | { | ||
338 | m_log.Error("[UDPSERVER]: " + a); | ||
339 | } | ||
340 | |||
341 | // ENDLESS LOOP ON PURPOSE! | ||
342 | |||
343 | // We need to purge the UDP stream of crap from the client that disconnected nastily or the UDP server will die | ||
344 | // The only way to do that is to beginreceive again! | ||
345 | BeginReceive(); | ||
346 | |||
347 | try | ||
348 | { | ||
349 | // m_socket.BeginReceiveFrom( | ||
350 | // RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref reusedEpSender, ReceivedData, null); | ||
351 | |||
352 | // Ter: For some stupid reason ConnectionReset basically kills our async event structure.. | ||
353 | // so therefore.. we've got to tell the server to BeginReceiveFrom again. | ||
354 | // This will happen over and over until we've gone through all packets | ||
355 | // sent to and from this particular user. | ||
356 | // Stupid I know.. | ||
357 | // but Flusing the buffer would be even more stupid... so, we're stuck with this ugly method. | ||
358 | } | ||
359 | catch (SocketException e) | ||
360 | { | ||
361 | m_log.DebugFormat("[UDPSERVER]: Exception {0} : {1}", e.Message, e.StackTrace ); | ||
362 | } | ||
363 | } | ||
364 | |||
365 | private void CloseEndPoint(EndPoint sender) | ||
366 | { | ||
367 | uint circuit; | ||
368 | lock (clientCircuits) | ||
369 | { | ||
370 | if (clientCircuits.TryGetValue(sender, out circuit)) | ||
371 | { | ||
372 | m_packetServer.CloseCircuit(circuit); | ||
373 | } | ||
374 | } | ||
375 | } | ||
376 | |||
377 | /// <summary> | 372 | /// <summary> |
378 | /// Add a new client circuit. | 373 | /// Add a new client circuit. |
379 | /// </summary> | 374 | /// </summary> |