rework TCPClient yet again to try to nail down this SLIP framing problem

This commit is contained in:
2023-11-25 22:46:06 -06:00
parent 486af45d53
commit 7b6ed09ced
2 changed files with 60 additions and 53 deletions
+2 -2
View File
@@ -6,7 +6,7 @@
<Authors>Joel Wetzell</Authors> <Authors>Joel Wetzell</Authors>
<Version>1.0.0-devel</Version> <Version>1.0.0-devel</Version>
<PackOnBuild>true</PackOnBuild> <PackOnBuild>true</PackOnBuild>
<PackageVersion>0.0.31</PackageVersion> <PackageVersion>0.0.32</PackageVersion>
<PackageId>QControlKit</PackageId> <PackageId>QControlKit</PackageId>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>
<Summary>Unofficial C# port of Figure53's QLabKit.objc</Summary> <Summary>Unofficial C# port of Figure53's QLabKit.objc</Summary>
@@ -17,7 +17,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Serilog" Version="2.12.0" /> <PackageReference Include="Serilog" Version="2.12.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="SuperSimpleTcp" Version="3.0.5" /> <PackageReference Include="TcpSharp" Version="1.2.0" />
<PackageReference Include="Zeroconf" Version="3.5.11" /> <PackageReference Include="Zeroconf" Version="3.5.11" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
+58 -51
View File
@@ -2,10 +2,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Net.Sockets;
using System.Threading;
using Serilog; using Serilog;
using SuperSimpleTcp; using TcpSharp.Events;
namespace SharpOSC namespace SharpOSC
{ {
@@ -37,9 +35,9 @@ namespace SharpOSC
string _address; string _address;
SimpleTcpClient tcpClient; TcpSharp.TcpSharpSocketClient tcpClient;
private List<byte> frameStream = new List<byte>();
public TCPClient(string address, int port) public TCPClient(string address, int port)
{ {
@@ -52,11 +50,11 @@ namespace SharpOSC
try try
{ {
tcpClient = new SimpleTcpClient(Address, Port); tcpClient = new TcpSharp.TcpSharpSocketClient(Address, Port);
tcpClient.Events.Connected += ClientConnected; tcpClient.OnConnected += ClientConnected;
tcpClient.Events.DataReceived += DataReceived; tcpClient.OnDataReceived += DataReceived;
tcpClient.Events.Disconnected += ClientDisconneted; tcpClient.OnDisconnected += ClientDisconneted;
tcpClient.Logger += TCPLog; tcpClient.OnError += ClientError;
tcpClient.Connect(); tcpClient.Connect();
return true; 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) private void TCPLog(string obj)
{ {
_log.Verbose($"{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(); 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)}"); int i = 0;
_log.Verbose($"Raw Data Received size: {e.Data.Count}"); int frameEnd = frameStream.FindIndex(1, frameByte=>frameByte.Equals(SlipFrame.END));
List<byte[]> messages = SlipFrame.Decode(e.Data.Array); while(frameEnd > 0)
_log.Verbose($"Slip decoded {messages.Count} osc messages"); {
foreach (var message in messages) List<byte> frame = frameStream.GetRange(0, frameEnd+1);
{ frameStream.RemoveRange(0, frameEnd + 1);
_log.Verbose($"Raw message contents: {Encoding.UTF8.GetString(message, 0, message.Length)}"); List<byte[]> messages = SlipFrame.Decode(frame.ToArray());
try foreach (var message in messages)
{ {
OscPacket packet = OscPacket.GetPacket(message); try
OscMessage responseMessage = (OscMessage)packet; {
if (packet == null) OscPacket packet = OscPacket.GetPacket(message);
{ OscMessage responseMessage = (OscMessage)packet;
_log.Error("packet is null"); if (packet == null)
} {
_log.Error("packet is null");
if (responseMessage == null) }
{
_log.Error("responeMessage is null"); if (responseMessage == null)
} {
_log.Error("responeMessage is null");
_log.Debug($"OSC Message Received: {responseMessage.Address}"); }
OnMessageReceived(responseMessage);
_log.Debug($"After OnMessageReceived Event"); _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()}"); 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}>"); _log.Debug($"connected to <{Address}:{Port}>");
} }
@@ -123,7 +131,7 @@ namespace SharpOSC
public void Send(byte[] message) public void Send(byte[] message)
{ {
byte[] slipData = SlipFrame.Encode(message); byte[] slipData = SlipFrame.Encode(message);
tcpClient.Send(slipData.ToArray()); tcpClient.SendBytes(slipData.ToArray());
} }
public void Send(OscPacket packet) public void Send(OscPacket packet)
@@ -139,7 +147,7 @@ namespace SharpOSC
if (tcpClient == null) if (tcpClient == null)
return false; return false;
else else
return tcpClient.IsConnected; return tcpClient.Connected;
} }
} }
@@ -147,14 +155,13 @@ namespace SharpOSC
{ {
if (tcpClient != null) if (tcpClient != null)
{ {
tcpClient.Events.Connected -= ClientConnected; tcpClient.OnConnected -= ClientConnected;
tcpClient.Events.DataReceived -= DataReceived; tcpClient.OnDataReceived -= DataReceived;
tcpClient.Events.Disconnected -= ClientDisconneted; tcpClient.OnDisconnected -= ClientDisconneted;
if (tcpClient.IsConnected) if (tcpClient.Connected)
{ {
_log.Debug($"closing connection to {Address}"); _log.Debug($"closing connection to {Address}");
tcpClient.Disconnect(); tcpClient.Disconnect();
tcpClient.Dispose();
} }
} }
} }