aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs1
-rw-r--r--OpenSim/Region/ClientStack/UDPServer.cs79
2 files changed, 72 insertions, 8 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index c9a71bd..5c179be 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -476,6 +476,7 @@ namespace OpenSim.Region.ClientStack
476 { 476 {
477 //session/circuit not authorised 477 //session/circuit not authorised
478 m_log.Info("[CLIENT]: New user request denied to " + m_userEndPoint.ToString()); 478 m_log.Info("[CLIENT]: New user request denied to " + m_userEndPoint.ToString());
479 m_packetQueue.Flush();
479 m_packetQueue.Close(); 480 m_packetQueue.Close();
480 m_clientThread.Abort(); 481 m_clientThread.Abort();
481 } 482 }
diff --git a/OpenSim/Region/ClientStack/UDPServer.cs b/OpenSim/Region/ClientStack/UDPServer.cs
index 0a301b5..73f2ac1 100644
--- a/OpenSim/Region/ClientStack/UDPServer.cs
+++ b/OpenSim/Region/ClientStack/UDPServer.cs
@@ -111,7 +111,7 @@ namespace OpenSim.Region.ClientStack
111 epSender = (EndPoint) ipeSender; 111 epSender = (EndPoint) ipeSender;
112 Packet packet = null; 112 Packet packet = null;
113 113
114 int numBytes; 114 int numBytes = 1;
115 115
116 try 116 try
117 { 117 {
@@ -173,8 +173,9 @@ namespace OpenSim.Region.ClientStack
173 // Stupid I know.. 173 // Stupid I know..
174 // but Flusing the buffer would be even more stupid... so, we're stuck with this ugly method. 174 // but Flusing the buffer would be even more stupid... so, we're stuck with this ugly method.
175 } 175 }
176 catch (SocketException) 176 catch (SocketException e2)
177 { 177 {
178 m_log.Error("[UDPSERVER]: " + e2.ToString());
178 } 179 }
179 180
180 // Here's some reference code! :D 181 // Here's some reference code! :D
@@ -187,12 +188,28 @@ namespace OpenSim.Region.ClientStack
187 break; 188 break;
188 } 189 }
189 190
190 return; 191 //return;
191 } 192 }
192 catch (ObjectDisposedException e) 193 catch (ObjectDisposedException e)
193 { 194 {
194 m_log.Debug("[UDPSERVER]: " + e.ToString()); 195 m_log.Debug("[UDPSERVER]: " + e.ToString());
195 return; 196 try
197 {
198 Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender,
199 ReceivedData, null);
200
201 // Ter: For some stupid reason ConnectionReset basically kills our async event structure..
202 // so therefore.. we've got to tell the server to BeginReceiveFrom again.
203 // This will happen over and over until we've gone through all packets
204 // sent to and from this particular user.
205 // Stupid I know..
206 // but Flusing the buffer would be even more stupid... so, we're stuck with this ugly method.
207 }
208 catch (SocketException e2)
209 {
210 m_log.Error("[UDPSERVER]: " + e2.ToString());
211 }
212 //return;
196 } 213 }
197 214
198 int packetEnd = numBytes - 1; 215 int packetEnd = numBytes - 1;
@@ -221,7 +238,16 @@ namespace OpenSim.Region.ClientStack
221 { 238 {
222 // new client 239 // new client
223 m_log.Debug("[UDPSERVER]: Adding New Client"); 240 m_log.Debug("[UDPSERVER]: Adding New Client");
224 AddNewClient(packet); 241 try
242 {
243 AddNewClient(packet);
244 }
245 catch (Exception e3)
246 {
247 m_log.Error("[UDPSERVER]: Adding New Client threw exception " + e3.ToString());
248 Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender,
249 ReceivedData, null);
250 }
225 } 251 }
226 else 252 else
227 { 253 {
@@ -231,8 +257,38 @@ namespace OpenSim.Region.ClientStack
231 257
232 } 258 }
233 } 259 }
260 try
261 {
262 Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
263 }
264 catch (SocketException e4)
265 {
266 try
267 {
268 CloseEndPoint(epSender);
269 }
270 catch (Exception a)
271 {
272 m_log.Info("[UDPSERVER]: " + a.ToString());
273 }
274 try
275 {
276 Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender,
277 ReceivedData, null);
278
279 // Ter: For some stupid reason ConnectionReset basically kills our async event structure..
280 // so therefore.. we've got to tell the server to BeginReceiveFrom again.
281 // This will happen over and over until we've gone through all packets
282 // sent to and from this particular user.
283 // Stupid I know..
284 // but Flusing the buffer would be even more stupid... so, we're stuck with this ugly method.
285 }
286 catch (SocketException e5)
287 {
288 m_log.Error("[UDPSERVER]: " + e5.ToString());
289 }
234 290
235 Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); 291 }
236 } 292 }
237 293
238 private void CloseEndPoint(EndPoint sender) 294 private void CloseEndPoint(EndPoint sender)
@@ -247,8 +303,15 @@ namespace OpenSim.Region.ClientStack
247 protected virtual void AddNewClient(Packet packet) 303 protected virtual void AddNewClient(Packet packet)
248 { 304 {
249 UseCircuitCodePacket useCircuit = (UseCircuitCodePacket) packet; 305 UseCircuitCodePacket useCircuit = (UseCircuitCodePacket) packet;
250 clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); 306 lock (clientCircuits)
251 clientCircuits_reverse.Add(useCircuit.CircuitCode.Code, epSender); 307 {
308 clientCircuits.Add(epSender, useCircuit.CircuitCode.Code);
309 }
310 lock (clientCircuits_reverse)
311 {
312 if (!clientCircuits_reverse.ContainsKey(useCircuit.CircuitCode.Code))
313 clientCircuits_reverse.Add(useCircuit.CircuitCode.Code, epSender);
314 }
252 315
253 PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_authenticateSessionsClass); 316 PacketServer.AddNewClient(epSender, useCircuit, m_assetCache, m_authenticateSessionsClass);
254 } 317 }