/// <summary> /// フレームに分割してエンキューする /// </summary> /// <param name="op"></param> /// <param name="bytes"></param> public void SendFrame(WebSocketFrameOpCode op, ArraySegment <Byte> bytes) { lock (m_lock) { var headerSize = GetHeaderSize(); if ((bytes.Count + headerSize) <= m_frameSize) { // 分割無し var item = GetOrCreateBuffer(); var buffer = new ByteBuffer(item); WriteHeader(buffer, op, bytes.Count, true); buffer.Push(bytes); m_sender.Enqueue(buffer.Bytes); return; } int payloadSize = 0; { //Logger.LogFormat("first: {0}/{1}", payloadSize, bytes.Count); // 先頭バッファ var item = GetOrCreateBuffer(); var buffer = new ByteBuffer(item); payloadSize = item.Length - headerSize; WriteHeader(buffer, op, payloadSize, false); var splited = Split(bytes, payloadSize); buffer.Push(splited.First); m_sender.Enqueue(buffer.Bytes); bytes = splited.Second; } while (bytes.Count > 0) { var item = GetOrCreateBuffer(); var buffer = new ByteBuffer(item); if (bytes.Count <= payloadSize) { //Logger.LogFormat("fin: {0}", bytes.Count); // last WriteHeader(buffer, WebSocketFrameOpCode.Continuours, bytes.Count, true); buffer.Push(bytes); m_sender.Enqueue(buffer.Bytes); break; } else { //Logger.LogFormat("continue: {0}", payloadSize); // 継続 WriteHeader(buffer, WebSocketFrameOpCode.Continuours, payloadSize, false); var splited = Split(bytes, payloadSize); buffer.Push(splited.First); m_sender.Enqueue(buffer.Bytes); bytes = splited.Second; } } } }
public static void WriteHeader(ByteBuffer buffer, WebSocketFrameOpCode op, int payloadSize, bool fin) { Byte b0 = (Byte)(fin ? 0x80 : 0x00); b0 |= (Byte)op; buffer.Push(b0); if (payloadSize < 126) { Byte b1 = (Byte)payloadSize; buffer.Push(b1); } else if (payloadSize < UInt16.MaxValue) { Byte b1 = 126; buffer.Push(b1); var count = (UInt16)payloadSize; // network byte order(big endian) buffer.Push((Byte)(count >> 8)); buffer.Push((Byte)(count & 0xFF)); } else { Byte b1 = 127; buffer.Push(b1); var count = (UInt64)payloadSize; // network byte order(big endian) buffer.Push((Byte)(count >> 56)); buffer.Push((Byte)(count >> 48)); buffer.Push((Byte)(count >> 40)); buffer.Push((Byte)(count >> 32)); buffer.Push((Byte)(count >> 24)); buffer.Push((Byte)(count >> 16)); buffer.Push((Byte)(count >> 8)); buffer.Push((Byte)(count & 0xFF)); } }
public void SendFrame(WebSocketFrameOpCode op, ArraySegment <byte> bytes) { var sessions = Sessions; foreach (var session in sessions) { try { session.SendFrame(op, bytes); } catch (ObjectDisposedException) { session.Dispose(); } catch (Exception ex) { //session.Dispose(); Logger.Exception(ex); } } }