From 8448f0a30b021e1cd5fb918a18fea48f6fa4175b Mon Sep 17 00:00:00 2001 From: sta Date: Fri, 14 Feb 2014 20:46:55 +0900 Subject: [PATCH] Fix for issue #30 --- websocket-sharp/WebSocket.cs | 76 ++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/websocket-sharp/WebSocket.cs b/websocket-sharp/WebSocket.cs index b42a3fcc..bc80eea6 100644 --- a/websocket-sharp/WebSocket.cs +++ b/websocket-sharp/WebSocket.cs @@ -1509,52 +1509,60 @@ namespace WebSocketSharp } // As server, used to broadcast - internal void Send ( - Opcode opcode, byte [] data, Dictionary cache) + internal void Send (Opcode opcode, byte [] data, Dictionary cache) { lock (_forSend) { - try { - byte [] cached; - if (!cache.TryGetValue (_compression, out cached)) { - cached = WsFrame.CreateFrame ( - Fin.FINAL, - opcode, - Mask.UNMASK, - data.Compress (_compression), - _compression != CompressionMethod.NONE).ToByteArray (); + lock (_forConn) { + if (_readyState != WebSocketState.OPEN) + return; - cache.Add (_compression, cached); + try { + byte [] cached; + if (!cache.TryGetValue (_compression, out cached)) { + cached = WsFrame.CreateFrame ( + Fin.FINAL, + opcode, + Mask.UNMASK, + data.Compress (_compression), + _compression != CompressionMethod.NONE) + .ToByteArray (); + + cache.Add (_compression, cached); + } + + _stream.Write (cached); + } + catch (Exception ex) { + _logger.Fatal (ex.ToString ()); + error ("An exception has occurred while sending a data."); } - - send (cached); - } - catch (Exception ex) { - _logger.Fatal (ex.ToString ()); - error ("An exception has occurred while sending a data."); } } } // As server, used to broadcast - internal void Send ( - Opcode opcode, Stream stream, Dictionary cache) + internal void Send (Opcode opcode, Stream stream, Dictionary cache) { lock (_forSend) { - try { - Stream cached; - if (!cache.TryGetValue (_compression, out cached)) { - cached = stream.Compress (_compression); - cache.Add (_compression, cached); - } - else - cached.Position = 0; + lock (_forConn) { + if (_readyState != WebSocketState.OPEN) + return; - sendFragmented ( - opcode, cached, Mask.UNMASK, _compression != CompressionMethod.NONE); - } - catch (Exception ex) { - _logger.Fatal (ex.ToString ()); - error ("An exception has occurred while sending a data."); + try { + Stream cached; + if (!cache.TryGetValue (_compression, out cached)) { + cached = stream.Compress (_compression); + cache.Add (_compression, cached); + } + else + cached.Position = 0; + + sendFragmented (opcode, cached, Mask.UNMASK, _compression != CompressionMethod.NONE); + } + catch (Exception ex) { + _logger.Fatal (ex.ToString ()); + error ("An exception has occurred while sending a data."); + } } } }