diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 86 |
1 files changed, 51 insertions, 35 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 0b17d1b..24bb502 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -76,6 +76,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
76 | protected IPAddress listenIP = IPAddress.Parse("0.0.0.0"); | 76 | protected IPAddress listenIP = IPAddress.Parse("0.0.0.0"); |
77 | protected IScene m_localScene; | 77 | protected IScene m_localScene; |
78 | protected IAssetCache m_assetCache; | 78 | protected IAssetCache m_assetCache; |
79 | protected int m_clientSocketReceiveBuffer = 0; | ||
79 | 80 | ||
80 | /// <value> | 81 | /// <value> |
81 | /// Manages authentication for agent circuits | 82 | /// Manages authentication for agent circuits |
@@ -157,6 +158,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
157 | { | 158 | { |
158 | if (config.Contains("client_throttle_multiplier")) | 159 | if (config.Contains("client_throttle_multiplier")) |
159 | userSettings.ClientThrottleMultipler = config.GetFloat("client_throttle_multiplier"); | 160 | userSettings.ClientThrottleMultipler = config.GetFloat("client_throttle_multiplier"); |
161 | if (config.Contains("client_socket_rcvbuf_size")) | ||
162 | m_clientSocketReceiveBuffer = config.GetInt("client_socket_rcvbuf_size"); | ||
160 | } | 163 | } |
161 | 164 | ||
162 | m_log.DebugFormat("[CLIENT]: client_throttle_multiplier = {0}", userSettings.ClientThrottleMultipler); | 165 | m_log.DebugFormat("[CLIENT]: client_throttle_multiplier = {0}", userSettings.ClientThrottleMultipler); |
@@ -188,47 +191,54 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
188 | Packet packet = null; | 191 | Packet packet = null; |
189 | int numBytes = 1; | 192 | int numBytes = 1; |
190 | EndPoint epSender = new IPEndPoint(IPAddress.Any, 0); | 193 | EndPoint epSender = new IPEndPoint(IPAddress.Any, 0); |
194 | EndPoint epProxy = null; | ||
191 | 195 | ||
192 | if (EndReceive(out numBytes, result, ref epSender)) | 196 | try |
193 | { | 197 | { |
194 | // Make sure we are getting zeroes when running off the | 198 | if (EndReceive(out numBytes, result, ref epSender)) |
195 | // end of grab / degrab packets from old clients | ||
196 | Array.Clear(RecvBuffer, numBytes, RecvBuffer.Length - numBytes); | ||
197 | |||
198 | int packetEnd = numBytes - 1; | ||
199 | if (proxyPortOffset != 0) packetEnd -= 6; | ||
200 | |||
201 | try | ||
202 | { | ||
203 | packet = PacketPool.Instance.GetPacket(RecvBuffer, ref packetEnd, ZeroBuffer); | ||
204 | } | ||
205 | catch (MalformedDataException e) | ||
206 | { | ||
207 | m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to MalformedDataException: {0}", e.StackTrace); | ||
208 | } | ||
209 | catch (IndexOutOfRangeException e) | ||
210 | { | 199 | { |
211 | m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to IndexOutOfRangeException: {0}", e.StackTrace); | 200 | // Make sure we are getting zeroes when running off the |
212 | } | 201 | // end of grab / degrab packets from old clients |
213 | catch (Exception e) | 202 | Array.Clear(RecvBuffer, numBytes, RecvBuffer.Length - numBytes); |
214 | { | 203 | |
215 | m_log.Debug("[CLIENT]: " + e); | 204 | int packetEnd = numBytes - 1; |
216 | } | 205 | if (proxyPortOffset != 0) packetEnd -= 6; |
217 | } | 206 | |
207 | try | ||
208 | { | ||
209 | packet = PacketPool.Instance.GetPacket(RecvBuffer, ref packetEnd, ZeroBuffer); | ||
210 | } | ||
211 | catch (MalformedDataException e) | ||
212 | { | ||
213 | m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to MalformedDataException: {0}", e.StackTrace); | ||
214 | } | ||
215 | catch (IndexOutOfRangeException e) | ||
216 | { | ||
217 | m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to IndexOutOfRangeException: {0}", e.StackTrace); | ||
218 | } | ||
219 | catch (Exception e) | ||
220 | { | ||
221 | m_log.Debug("[CLIENT]: " + e); | ||
222 | } | ||
223 | } | ||
218 | 224 | ||
219 | EndPoint epProxy = null; | 225 | |
220 | 226 | if (proxyPortOffset != 0) | |
221 | if (proxyPortOffset != 0) | ||
222 | { | ||
223 | // If we've received a use circuit packet, then we need to decode an endpoint proxy, if one exists, | ||
224 | // before allowing the RecvBuffer to be overwritten by the next packet. | ||
225 | if (packet != null && packet.Type == PacketType.UseCircuitCode) | ||
226 | { | 227 | { |
227 | epProxy = epSender; | 228 | // If we've received a use circuit packet, then we need to decode an endpoint proxy, if one exists, |
229 | // before allowing the RecvBuffer to be overwritten by the next packet. | ||
230 | if (packet != null && packet.Type == PacketType.UseCircuitCode) | ||
231 | { | ||
232 | epProxy = epSender; | ||
233 | } | ||
234 | |||
235 | // Now decode the message from the proxy server | ||
236 | epSender = ProxyCodec.DecodeProxyMessage(RecvBuffer, ref numBytes); | ||
228 | } | 237 | } |
229 | 238 | } | |
230 | // Now decode the message from the proxy server | 239 | catch (Exception ex) |
231 | epSender = ProxyCodec.DecodeProxyMessage(RecvBuffer, ref numBytes); | 240 | { |
241 | m_log.ErrorFormat("[CLIENT]: Exception thrown during EndReceive(): {0}", ex); | ||
232 | } | 242 | } |
233 | 243 | ||
234 | BeginRobustReceive(); | 244 | BeginRobustReceive(); |
@@ -324,6 +334,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
324 | 334 | ||
325 | done = true; | 335 | done = true; |
326 | } | 336 | } |
337 | catch (Exception ex) | ||
338 | { | ||
339 | m_log.ErrorFormat("[CLIENT]: Exception thrown during BeginReceive(): {0}", ex); | ||
340 | } | ||
327 | } | 341 | } |
328 | } | 342 | } |
329 | 343 | ||
@@ -472,6 +486,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
472 | 486 | ||
473 | ServerIncoming = new IPEndPoint(listenIP, (int)newPort); | 487 | ServerIncoming = new IPEndPoint(listenIP, (int)newPort); |
474 | m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); | 488 | m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); |
489 | if (0 != m_clientSocketReceiveBuffer) | ||
490 | m_socket.ReceiveBufferSize = m_clientSocketReceiveBuffer; | ||
475 | m_socket.Bind(ServerIncoming); | 491 | m_socket.Bind(ServerIncoming); |
476 | // Add flags to the UDP socket to prevent "Socket forcibly closed by host" | 492 | // Add flags to the UDP socket to prevent "Socket forcibly closed by host" |
477 | // uint IOC_IN = 0x80000000; | 493 | // uint IOC_IN = 0x80000000; |