public void VirtualChannelOpenEvent(int openHandle, ChannelEvents Event, IntPtr pData, int dataLength, uint totalLength, ChannelFlags dataFlags) { Debug.Print(DateTime.Now + " " + Environment.MachineName + ": VirtualChannelOpenEvent: " + Event); switch (Event) { case ChannelEvents.DataReceived: var data = new byte[dataLength]; Marshal.Copy(pData, data, 0, dataLength); switch (dataFlags & ChannelFlags.Only) { case ChannelFlags.Only: MessageReceived(ChannelMessage.FromByteArray(data)); break; case ChannelFlags.First: memoryStream = new MemoryStream((int)totalLength); memoryStream.Write(data, 0, data.Length); break; case ChannelFlags.Middle: if (memoryStream != null) { memoryStream.Write(data, 0, data.Length); } break; case ChannelFlags.Last: if (memoryStream != null) { memoryStream.Write(data, 0, data.Length); memoryStream.Position = 0; MessageReceived(ChannelMessage.FromStream(memoryStream)); memoryStream = null; } break; } break; case ChannelEvents.WriteCanceled: case ChannelEvents.WriteComplete: /* * The VirtualChannelWrite function is asynchronous. When the write operation has been completed, * your VirtualChannelOpenEvent function receives a CHANNEL_EVENT_WRITE_COMPLETE notification. * Until that notification is received, the caller must not free or reuse the pData buffer passed to VirtualChannelWrite */ Marshal.FreeHGlobal(pData); break; } }
private void Process() { while (IsConnected) { try { var len = reader.ReadInt32(); var buff = reader.ReadBytes(len); MessageReceived(ChannelMessage.FromByteArray(buff)); } catch (OperationCanceledException) { return; } catch (Exception ex) { Log(ex); } } }