mirror of
https://github.com/jwetzell/qController.git
synced 2026-08-19 22:24:18 +00:00
Migrate All Communication to TCP
This commit is contained in:
@@ -3,9 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Net.Sockets;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.IO;
|
||||
|
||||
namespace SharpOSC
|
||||
{
|
||||
@@ -22,8 +20,8 @@ namespace SharpOSC
|
||||
get { return _address; }
|
||||
}
|
||||
string _address;
|
||||
|
||||
TcpClient client;
|
||||
Thread receivingThread;
|
||||
|
||||
byte END = 0xc0;
|
||||
byte ESC = 0xdb;
|
||||
@@ -35,70 +33,106 @@ namespace SharpOSC
|
||||
{
|
||||
_port = port;
|
||||
_address = address;
|
||||
|
||||
}
|
||||
|
||||
public void Send(byte[] message)
|
||||
{
|
||||
client = new TcpClient(Address, Port);
|
||||
Console.WriteLine("Available: " + client.Available);
|
||||
Console.WriteLine("Connected: " + client.Connected);
|
||||
List<byte> slipData= new List<byte>();
|
||||
|
||||
byte[] esc_end = { ESC, ESC_END };
|
||||
byte[] esc_esc = { ESC, ESC_ESC };
|
||||
byte[] end = { END };
|
||||
|
||||
int length = message.Length;
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
if (message[i] == END)
|
||||
{
|
||||
slipData.AddRange(esc_end);
|
||||
} else if (message[i] == ESC)
|
||||
{
|
||||
slipData.AddRange(esc_esc);
|
||||
}
|
||||
else
|
||||
{
|
||||
slipData.Add(message[i]);
|
||||
}
|
||||
}
|
||||
slipData.AddRange(end);
|
||||
byte[] slipData = SlipEncode(message);
|
||||
NetworkStream netStream = client.GetStream();
|
||||
netStream.Write(slipData.ToArray(), 0, slipData.ToArray().Length);
|
||||
netStream.Close();
|
||||
client.Close();
|
||||
}
|
||||
|
||||
public void Receive()
|
||||
public OscMessage Receive()
|
||||
{
|
||||
NetworkStream netStream = client.GetStream();
|
||||
List<byte> responseData = new List<byte>();
|
||||
if (netStream.CanRead)
|
||||
OscMessage response = new OscMessage("/null");
|
||||
try
|
||||
{
|
||||
byte[] buffer = new byte[512];
|
||||
|
||||
int bytesRead = 0;
|
||||
do
|
||||
NetworkStream netStream = client.GetStream();
|
||||
netStream.ReadTimeout = 250;
|
||||
List<byte> responseData = new List<byte>();
|
||||
if (netStream.CanRead)
|
||||
{
|
||||
bytesRead = netStream.Read(buffer, 0, buffer.Length);
|
||||
responseData.AddRange(buffer);
|
||||
byte[] buffer = new byte[1024];
|
||||
|
||||
} while (netStream.DataAvailable);
|
||||
OscMessage response = (OscMessage)OscPacket.GetPacket(responseData.Skip(1).ToArray());
|
||||
int bytesRead = 0;
|
||||
do
|
||||
{
|
||||
bytesRead = netStream.Read(buffer, 0, buffer.Length);
|
||||
responseData.AddRange(buffer);
|
||||
} while (netStream.DataAvailable);
|
||||
response = (OscMessage)OscPacket.GetPacket(responseData.Skip(1).ToArray());
|
||||
netStream.Close();
|
||||
client.Close();
|
||||
}
|
||||
} catch(Exception e)
|
||||
{
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
netStream.Close();
|
||||
return response;
|
||||
}
|
||||
|
||||
public OscMessage SendAndReceive(byte[] message)
|
||||
{
|
||||
client = new TcpClient(Address, Port);
|
||||
byte[] slipData = SlipEncode(message);
|
||||
NetworkStream netStream = client.GetStream();
|
||||
netStream.Write(slipData.ToArray(), 0, slipData.ToArray().Length);
|
||||
OscMessage response = Receive();
|
||||
return response;
|
||||
}
|
||||
|
||||
public OscMessage SendAndReceive(OscPacket packet)
|
||||
{
|
||||
byte[] data = packet.GetBytes();
|
||||
OscMessage response = SendAndReceive(data);
|
||||
return response;
|
||||
}
|
||||
public void StartReceiving()
|
||||
{
|
||||
receivingThread.Start();
|
||||
}
|
||||
|
||||
public void Send(OscPacket packet)
|
||||
{
|
||||
byte[] data = packet.GetBytes();
|
||||
Send(data);
|
||||
}
|
||||
|
||||
public byte[] SlipEncode(byte[] data)
|
||||
{
|
||||
List<byte> slipData = new List<byte>();
|
||||
|
||||
byte[] esc_end = { ESC, ESC_END };
|
||||
byte[] esc_esc = { ESC, ESC_ESC };
|
||||
byte[] end = { END };
|
||||
|
||||
int length = data.Length;
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
if (data[i] == END)
|
||||
{
|
||||
slipData.AddRange(esc_end);
|
||||
}
|
||||
else if (data[i] == ESC)
|
||||
{
|
||||
slipData.AddRange(esc_esc);
|
||||
}
|
||||
else
|
||||
{
|
||||
slipData.Add(data[i]);
|
||||
}
|
||||
}
|
||||
slipData.AddRange(end);
|
||||
return slipData.ToArray();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
client.GetStream().Close();
|
||||
receivingThread.Abort();
|
||||
client.Close();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user