From 7b6ed09ced356b709d1a9448ea4cf0101b93498c Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Sat, 25 Nov 2023 22:46:06 -0600 Subject: [PATCH] rework TCPClient yet again to try to nail down this SLIP framing problem --- QControlKit/QControlKit.csproj | 4 +- QControlKit/SharpOSC/TCPClient.cs | 109 ++++++++++++++++-------------- 2 files changed, 60 insertions(+), 53 deletions(-) diff --git a/QControlKit/QControlKit.csproj b/QControlKit/QControlKit.csproj index 302390e..966509d 100644 --- a/QControlKit/QControlKit.csproj +++ b/QControlKit/QControlKit.csproj @@ -6,7 +6,7 @@ Joel Wetzell 1.0.0-devel true - 0.0.31 + 0.0.32 QControlKit MIT Unofficial C# port of Figure53's QLabKit.objc @@ -17,7 +17,7 @@ - + diff --git a/QControlKit/SharpOSC/TCPClient.cs b/QControlKit/SharpOSC/TCPClient.cs index f240250..23e584d 100644 --- a/QControlKit/SharpOSC/TCPClient.cs +++ b/QControlKit/SharpOSC/TCPClient.cs @@ -2,10 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using System.Net.Sockets; -using System.Threading; using Serilog; -using SuperSimpleTcp; +using TcpSharp.Events; namespace SharpOSC { @@ -37,9 +35,9 @@ namespace SharpOSC string _address; - SimpleTcpClient tcpClient; - + TcpSharp.TcpSharpSocketClient tcpClient; + private List frameStream = new List(); public TCPClient(string address, int port) { @@ -52,11 +50,11 @@ namespace SharpOSC try { - tcpClient = new SimpleTcpClient(Address, Port); - tcpClient.Events.Connected += ClientConnected; - tcpClient.Events.DataReceived += DataReceived; - tcpClient.Events.Disconnected += ClientDisconneted; - tcpClient.Logger += TCPLog; + tcpClient = new TcpSharp.TcpSharpSocketClient(Address, Port); + tcpClient.OnConnected += ClientConnected; + tcpClient.OnDataReceived += DataReceived; + tcpClient.OnDisconnected += ClientDisconneted; + tcpClient.OnError += ClientError; tcpClient.Connect(); return true; } @@ -67,55 +65,65 @@ namespace SharpOSC } } + private void ClientError(object sender, OnClientErrorEventArgs e) + { + _log.Error("client error"); + _log.Error(e.Exception.ToString()); + } private void TCPLog(string obj) { _log.Verbose($"{obj}"); } - private void ClientDisconneted(object sender, ConnectionEventArgs e) + private void ClientDisconneted(object sender, OnClientDisconnectedEventArgs e) { - _log.Verbose($"{e.IpPort} client disconnected: {e.Reason}"); + _log.Verbose($"client disconnected: {e.Reason}"); Close(); } - private void DataReceived(object sender, DataReceivedEventArgs e) + private void DataReceived(object sender, OnClientDataReceivedEventArgs e) { + frameStream.AddRange(e.Data); - _log.Verbose($"Raw Data Received contents: {Encoding.UTF8.GetString(e.Data.Array, 0, e.Data.Count)}"); - _log.Verbose($"Raw Data Received size: {e.Data.Count}"); - List messages = SlipFrame.Decode(e.Data.Array); - _log.Verbose($"Slip decoded {messages.Count} osc messages"); - foreach (var message in messages) - { - _log.Verbose($"Raw message contents: {Encoding.UTF8.GetString(message, 0, message.Length)}"); - try - { - OscPacket packet = OscPacket.GetPacket(message); - OscMessage responseMessage = (OscMessage)packet; - if (packet == null) - { - _log.Error("packet is null"); - } - - if (responseMessage == null) - { - _log.Error("responeMessage is null"); - } - - _log.Debug($"OSC Message Received: {responseMessage.Address}"); - OnMessageReceived(responseMessage); - _log.Debug($"After OnMessageReceived Event"); - - } - catch (Exception ex) - { - _log.Error($"Exception parsing OSC message: {ex.ToString()}"); - } + int i = 0; + int frameEnd = frameStream.FindIndex(1, frameByte=>frameByte.Equals(SlipFrame.END)); + while(frameEnd > 0) + { + List frame = frameStream.GetRange(0, frameEnd+1); + frameStream.RemoveRange(0, frameEnd + 1); + List messages = SlipFrame.Decode(frame.ToArray()); + foreach (var message in messages) + { + try + { + OscPacket packet = OscPacket.GetPacket(message); + OscMessage responseMessage = (OscMessage)packet; + if (packet == null) + { + _log.Error("packet is null"); + } + + if (responseMessage == null) + { + _log.Error("responeMessage is null"); + } + + _log.Debug($"OSC Message Received: {responseMessage.Address}"); + OnMessageReceived(responseMessage); + _log.Debug($"After OnMessageReceived Event"); + + } + catch (Exception ex) + { + _log.Error($"Exception parsing OSC message: {ex.ToString()}"); + } + } + frameEnd = frameStream.FindIndex(0, frameByte => frameByte.Equals(SlipFrame.END)); } } - private void ClientConnected(object sender, ConnectionEventArgs e) + private void ClientConnected(object sender, OnClientConnectedEventArgs e) { _log.Debug($"connected to <{Address}:{Port}>"); } @@ -123,7 +131,7 @@ namespace SharpOSC public void Send(byte[] message) { byte[] slipData = SlipFrame.Encode(message); - tcpClient.Send(slipData.ToArray()); + tcpClient.SendBytes(slipData.ToArray()); } public void Send(OscPacket packet) @@ -139,7 +147,7 @@ namespace SharpOSC if (tcpClient == null) return false; else - return tcpClient.IsConnected; + return tcpClient.Connected; } } @@ -147,14 +155,13 @@ namespace SharpOSC { if (tcpClient != null) { - tcpClient.Events.Connected -= ClientConnected; - tcpClient.Events.DataReceived -= DataReceived; - tcpClient.Events.Disconnected -= ClientDisconneted; - if (tcpClient.IsConnected) + tcpClient.OnConnected -= ClientConnected; + tcpClient.OnDataReceived -= DataReceived; + tcpClient.OnDisconnected -= ClientDisconneted; + if (tcpClient.Connected) { _log.Debug($"closing connection to {Address}"); tcpClient.Disconnect(); - tcpClient.Dispose(); } } }