/// <summary> /// WebSocket结束 /// </summary> protected override void webSocketEnd() { Interlocked.Increment(ref identity); webSocket.socket webSocket = webSocketReceiver.WebSocket; webSocketReceiver.WebSocket = null; pub.Dispose(ref SslStream); pub.Dispose(ref networkStream); if (Socket != null) { fastCSharp.threading.disposeTimer.Default.addSocketClose(Socket); } webSocket.Close(); if (Ipv6.Ip == null) { if ((Socket = server.SocketEnd(Ipv4)) != null) { start(); return; } } else { if ((Socket = server.SocketEnd(ref Ipv6)) != null) { start(); return; } Ipv6.Null(); } typePool <sslStream> .PushNotNull(this); }
public void Receive(webSocket.socket webSocket) { this.WebSocket = webSocket; webSocket.SslStream = socket.SslStream; webSocket.Parser.Buffer = buffer; receiveEndIndex = 0; receive(); }
/// <summary> /// 开始接收WebSocket数据 /// </summary> /// <param name="webSocket"></param> protected override void receiveWebSocket(webSocket.socket webSocket) { if (webSocketReceiver == null) { webSocketReceiver = new webSocketIdentityReceiver(this); } webSocketReceiver.Receive(webSocket); }
/// <summary> /// 发送消息 /// </summary> /// <param name="webSocket"></param> internal unsafe void Send(webSocket.socket webSocket) { byte[] buffer = fastCSharp.memoryPool.StreamBuffers.Get(); webSocket.socket.message message = default(webSocket.socket.message); try { fixed(byte *bufferFixed = buffer) { using (unmanagedStream stream = new unmanagedStream(bufferFixed, buffer.Length)) { sender sender = new sender { Buffer = buffer, BufferFixed = bufferFixed, Stream = stream }; do { if (webSocket == this.WebSocket && webSocket.SocketIdentity == socket.identity) { if (webSocket.GetMessage(ref message)) { sender.Send(ref message); if ((stream.Length << 1) > buffer.Length) { byte[] data = sender.GetData(); Monitor.Enter(sendLock); try { webSocket.SslStream.Write(data, 0, stream.Length); ++socket.timeoutIdentity; } finally { Monitor.Exit(sendLock); } stream.UnsafeSetLength(0); } else if (webSocket.MessageCount == 0) { Thread.Sleep(0); } } else { if (stream.Length != 0) { byte[] data = sender.GetData(); Monitor.Enter(sendLock); try { webSocket.SslStream.Write(data, 0, stream.Length); ++socket.timeoutIdentity; } finally { Monitor.Exit(sendLock); } } return; } } else { break; } }while (true); } } } catch { } finally { fastCSharp.memoryPool.StreamBuffers.PushNotNull(buffer); } webSocket.Client.shutdown(); }
/// <summary> /// WebSocket发送消息 /// </summary> /// <param name="webSocket"></param> internal override void WebSocketSend(webSocket.socket webSocket) { webSocketReceiver.Send(webSocket); }