public void Flush() { if (_socket != null) { _socket.Flush(); } }
/// <summary> /// Handle a HTTP Upgrade request. /// </summary> /// <param name="req"></param> /// <param name="conn"></param> public void HandleUpgrade(HttpServerRequest req, TcpSocket socket, ArraySegment <byte> head) { if (!socket.Readable || !socket.Writable) { socket.Destroy(); return; } if (OnConnection == null) { AbortConnection(socket, 400); return; } var upgrade = req.Headers["upgrade"]; var version = req.Headers["sec-websocket-version"]; if ((version != "13" && version != "8") || !string.Equals(upgrade, "websocket", StringComparison.InvariantCultureIgnoreCase)) { socket.Write(Encoding.ASCII.GetBytes( "HTTP/1.1 400 Bad Request\r\n" + "Connection: close\r\n" + "Sec-WebSocket-Version: 13, 8\r\n")); socket.Close(); return; } string acceptKey; using (var sha1 = new System.Security.Cryptography.SHA1CryptoServiceProvider()) { var key = req.Headers["sec-websocket-key"]; acceptKey = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(key + GUID))); } socket.Write(Encoding.UTF8.GetBytes( "HTTP/1.1 101 Switching Protocols\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Accept: " + acceptKey + "\r\n\r\n")); socket.Flush(); OnConnection.Invoke(new WebSocket(socket, req, head)); }
private void SendFrame(byte opcode, bool mask, bool fin, BufferData buff) { int payloadlen = buff != null ? buff.ByteLength : 0; int bufflen = payloadlen; int headerlen = 2; if (payloadlen >= 65535) { headerlen += 8; payloadlen = 127; } else if (payloadlen > 125) { headerlen += 2; payloadlen = 126; } int maskpos = headerlen; if (mask) { headerlen += 4; headerlen += bufflen; } var header = new byte[headerlen]; header[0] = (byte)((fin ? 0x80 : 0) | (opcode & 0x0f)); header[1] = (byte)((mask ? 0x80 : 0) | (payloadlen)); if (payloadlen == 126) { var len = bufflen; header[2] = (byte)(len >> 8); header[3] = (byte)(len >> 0); } else if (payloadlen == 127) { var len = bufflen; header[2] = (byte)(len >> 24); header[3] = (byte)(len >> 16); header[4] = (byte)(len >> 8); header[5] = (byte)(len >> 0); } if (mask) { var r = _rand; _rand = _rand * 1103515245 + 12345; r = 0; header[maskpos + 0] = (byte)(r >> 24); header[maskpos + 1] = (byte)(r >> 16); header[maskpos + 2] = (byte)(r >> 8); header[maskpos + 3] = (byte)(r >> 0); int p = maskpos + 4; int maskid = 3; if (buff != null) { foreach (var d in buff) { var buf = d.Array; for (int i = d.Offset; i < d.Offset + d.Count; i++) { header[p] = (byte)(buf[i] ^ (byte)(r >> (maskid * 8))); maskid = ((maskid - 1) & 3); p++; } } } _socket.Write(header); } else { _socket.Write(header); _socket.Write(buff); } _socket.Flush(); }
public void Flush() { _socket.Flush(); }