commit 3155f0ceab82598b2730b6ad19899132b7d04831 Author: Bart Moyaers Date: Wed Apr 11 23:08:18 2018 +0200 First commit diff --git a/AccelVisualizer/AccelVisualizer.csproj b/AccelVisualizer/AccelVisualizer.csproj new file mode 100644 index 0000000..52f11b1 --- /dev/null +++ b/AccelVisualizer/AccelVisualizer.csproj @@ -0,0 +1,109 @@ + + + + + Debug + AnyCPU + {FCBC25C8-0BBF-4EA4-9043-743B06FFBC02} + WinExe + AccelVisualizer + AccelVisualizer + v4.6.1 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\packages\LiveCharts.0.9.7\lib\net45\LiveCharts.dll + + + ..\packages\LiveCharts.Wpf.0.9.7\lib\net45\LiveCharts.Wpf.dll + + + + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + Chart.xaml + + + + + Designer + MSBuild:Compile + + + App.xaml + Code + + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + \ No newline at end of file diff --git a/AccelVisualizer/App.config b/AccelVisualizer/App.config new file mode 100644 index 0000000..731f6de --- /dev/null +++ b/AccelVisualizer/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AccelVisualizer/App.xaml b/AccelVisualizer/App.xaml new file mode 100644 index 0000000..a5df817 --- /dev/null +++ b/AccelVisualizer/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/AccelVisualizer/App.xaml.cs b/AccelVisualizer/App.xaml.cs new file mode 100644 index 0000000..3d7645d --- /dev/null +++ b/AccelVisualizer/App.xaml.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace AccelVisualizer +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + + } +} diff --git a/AccelVisualizer/Chart.xaml b/AccelVisualizer/Chart.xaml new file mode 100644 index 0000000..f7c6b97 --- /dev/null +++ b/AccelVisualizer/Chart.xaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AccelVisualizer/Chart.xaml.cs b/AccelVisualizer/Chart.xaml.cs new file mode 100644 index 0000000..0cc5816 --- /dev/null +++ b/AccelVisualizer/Chart.xaml.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using LiveCharts; +using LiveCharts.Wpf; +using LiveCharts.Configurations; + +namespace AccelVisualizer +{ + public partial class Chart : Window, INotifyPropertyChanged + { + public ChartValues ChartValuesX { get; set; } + public ChartValues ChartValuesY { get; set; } + public ChartValues ChartValuesZ { get; set; } + + public Func DateTimeFormatter { get; set; } + public double AxisStep { get; set; } + public double AxisUnit { get; set; } + private double _axisMax; + private double _axisMin; + double startTime; + + StampedSensorData sensorData; + bool listening; + + public Chart() + { + InitializeComponent(); + + //Mapper to plot points correctly + var mapper = Mappers.Xy() + .X(model => model.seconds) + .Y(model => model.Value); + + //Save mapper globally + Charting.For(mapper); + + ChartValuesX = new ChartValues(); + ChartValuesY = new ChartValues(); + ChartValuesZ = new ChartValues(); + + //set how to display the X Labels + //DateTimeFormatter = value => (long)Math.Floor(value); + + //AxisStep forces the distance between each separator in the X axis + AxisStep = 1; + + //AxisUnit lets the axis know that we are plotting in seconds + AxisUnit = 1; + + //Init the UDP socket + UDPSocket.InitSocket(); + + //Send a package to server + UDPSocket.SendPacket(); + + //Receive first package and take note of start time + sensorData = UDPSocket.ReceivePacket(); + startTime = sensorData.GetSeconds(); + + //Set axes correctly + SetAxisLimits(0); + + //Plot first value + PlotSensorData(sensorData); + + DataContext = this; + + this.Show(); + + listening = true; + + //Start new thread for package listener + Task.Factory.StartNew(ReceivePackages); + } + + private void ReceivePackages() + { + while (listening) + { + sensorData = UDPSocket.ReceivePacket(); + Console.WriteLine(sensorData.ToString()); + PlotSensorData(sensorData); + + //Remove data when too large + if(ChartValuesX.Count > 100) + { + RemoveData(); + } + } + } + + private void RemoveData() + { + ChartValuesX.RemoveAt(0); + ChartValuesY.RemoveAt(0); + ChartValuesZ.RemoveAt(0); + } + + public double AxisMax + { + get { return _axisMax; } + set + { + _axisMax = value; + OnPropertyChanged("AxisMax"); + } + } + public double AxisMin + { + get { return _axisMin; } + set + { + _axisMin = value; + OnPropertyChanged("AxisMin"); + } + } + + private void SetAxisLimits(double now) + { + AxisMax = now + 1; // force the axis to be 1 second ahead + AxisMin = now - 10; // and 30 seconds behind + } + + private void PlotSensorData(StampedSensorData data) + { + //Convert to Measurement data types + Measurement X, Y, Z; + double now = data.GetSeconds() - startTime; + + X = new Measurement { Value = data.GetX(), seconds = now }; + Y = new Measurement { Value = data.GetY(), seconds = now }; + Z = new Measurement { Value = data.GetZ(), seconds = now }; + + //Add values to plot + ChartValuesX.Add(X); + ChartValuesY.Add(Y); + ChartValuesZ.Add(Z); + + //Update axes + SetAxisLimits(now); + } + + #region INotifyPropertyChanged implementation + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(string propertyName = null) + { + if (PropertyChanged != null) + PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + #endregion + } +} diff --git a/AccelVisualizer/Measurement.cs b/AccelVisualizer/Measurement.cs new file mode 100644 index 0000000..e70847a --- /dev/null +++ b/AccelVisualizer/Measurement.cs @@ -0,0 +1,12 @@ +using System; + +namespace AccelVisualizer +{ + public class Measurement + { + //public DateTime DateTime { get; set; } + public double seconds { get; set; } + public double Value { get; set; } + } +} + diff --git a/AccelVisualizer/Properties/AssemblyInfo.cs b/AccelVisualizer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..28abfe6 --- /dev/null +++ b/AccelVisualizer/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AccelVisualizer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AccelVisualizer")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AccelVisualizer/Properties/Resources.Designer.cs b/AccelVisualizer/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f739125 --- /dev/null +++ b/AccelVisualizer/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AccelVisualizer.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AccelVisualizer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/AccelVisualizer/Properties/Resources.resx b/AccelVisualizer/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/AccelVisualizer/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/AccelVisualizer/Properties/Settings.Designer.cs b/AccelVisualizer/Properties/Settings.Designer.cs new file mode 100644 index 0000000..ca4e180 --- /dev/null +++ b/AccelVisualizer/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AccelVisualizer.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/AccelVisualizer/Properties/Settings.settings b/AccelVisualizer/Properties/Settings.settings new file mode 100644 index 0000000..033d7a5 --- /dev/null +++ b/AccelVisualizer/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/AccelVisualizer/StampedSensorData.cs b/AccelVisualizer/StampedSensorData.cs new file mode 100644 index 0000000..b9471ec --- /dev/null +++ b/AccelVisualizer/StampedSensorData.cs @@ -0,0 +1,122 @@ +using System; +using System.Globalization; +using System.Net; +using System.Net.Sockets; +using System.Text; + +namespace AccelVisualizer +{ + public class StampedSensorData + { + //Acceleration in G's + float x, y, z; + + //Timestamp + double seconds; + + //Constructors + public StampedSensorData() + { + x = 0; + y = 0; + z = 0; + seconds = 0; + } + + public StampedSensorData(float x, float y, float z, ulong seconds, ulong nanoSeconds) + { + this.x = x; + this.y = y; + this.z = z; + this.seconds = ConvertToSeconds(seconds, nanoSeconds); + } + + //Setters + public void SetX(float newX) + { + x = newX; + } + + public void SetY(float newY) + { + y = newY; + } + + public void SetZ(float newY) + { + y = newY; + } + + public void SetSeconds(double newSeconds) + { + seconds = newSeconds; + } + + //Getters + public float GetX() + { + return x; + } + + public float GetY() + { + return y; + } + + public float GetZ() + { + return z; + } + + public double GetSeconds() + { + return seconds; + } + + //Convert to seconds + public static double ConvertToSeconds(ulong seconds, ulong nanoSeconds) + { + return seconds + nanoSeconds / 1000000000.0; + } + + public static StampedSensorData ReadString(string input) + { + input.Replace('.', ','); + string[] data = input.Split(';'); + + if(data.Length < 5) + { + //Invalid data read, return empty sensordata + return new StampedSensorData(); + } + + float x, y, z; + ulong seconds, nanoSeconds; + + if(float.TryParse(data[0], out x) + && float.TryParse(data[1], out y) + && float.TryParse(data[2], out z) + && ulong.TryParse(data[3], out seconds) + && ulong.TryParse(data[4], out nanoSeconds)) + { + //Succesfully parsed, return data + return new StampedSensorData(x, y, z, seconds, nanoSeconds); + } else + { + //Parse not succesful, return empty sensordata + return new StampedSensorData(); + } + } + + public override string ToString() + { + return "X: " + x.ToString() + " Y: " + y.ToString() + " Z: " + z.ToString() + " Seconds: " + seconds.ToString(); + } + + public long GetTimeTicks() + { + return (long) Math.Floor(seconds * TimeSpan.TicksPerSecond); + } + } + +} diff --git a/AccelVisualizer/UDPSocket.cs b/AccelVisualizer/UDPSocket.cs new file mode 100644 index 0000000..fd01c8e --- /dev/null +++ b/AccelVisualizer/UDPSocket.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Net; +using System.Net.Sockets; + +namespace AccelVisualizer +{ + class UDPSocket + { + // Data buffer for incoming data. + static byte[] bytes = new byte[512]; + + //Socket + static Socket sender; + static IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); + static IPAddress ipAddress = IPAddress.Parse("192.168.0.109"); + static IPEndPoint remoteEP; + + public static void InitSocket() + { + try + { + //Port 5000 + remoteEP = new IPEndPoint(ipAddress, 5000); + + // Create a TCP/IP socket. + sender = new Socket(ipAddress.AddressFamily, + SocketType.Dgram, ProtocolType.Udp); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + public static void SendPacket() + { + try + { + // Encode the data string into a byte array. + byte[] msg = Encoding.ASCII.GetBytes("Send anything to start receiving packages."); + + // Send the data through the socket. + int bytesSent = sender.SendTo(msg, remoteEP); + } + catch (ArgumentNullException ane) + { + Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); + } + catch (SocketException se) + { + Console.WriteLine("SocketException : {0}", se.ToString()); + } + catch (Exception e) + { + Console.WriteLine("Unexpected exception : {0}", e.ToString()); + } + } + + public static StampedSensorData ReceivePacket() + { + try + { + //Capture the identity of the sending host. + IPEndPoint sendingEndpoint = new IPEndPoint(IPAddress.Any, 0); + EndPoint senderRemote = (EndPoint)sendingEndpoint; + + int bytesRec = sender.ReceiveFrom(bytes, ref senderRemote); + string currentRead = Encoding.ASCII.GetString(bytes).Replace('.', ','); + + return StampedSensorData.ReadString(currentRead); + } + catch (ArgumentNullException ane) + { + Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); + return new StampedSensorData(); + } + catch (SocketException se) + { + Console.WriteLine("SocketException : {0}", se.ToString()); + return new StampedSensorData(); + } + catch (Exception e) + { + Console.WriteLine("Unexpected exception : {0}", e.ToString()); + return new StampedSensorData(); + } + } + + public static void CloseSocket() + { + // Release the socket. + sender.Shutdown(SocketShutdown.Both); + sender.Close(); + } + } +} diff --git a/AccelVisualizer/packages.config b/AccelVisualizer/packages.config new file mode 100644 index 0000000..1dbd7cb --- /dev/null +++ b/AccelVisualizer/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ClientTest.sln b/ClientTest.sln new file mode 100644 index 0000000..0396f24 --- /dev/null +++ b/ClientTest.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2027 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AccelVisualizer", "AccelVisualizer\AccelVisualizer.csproj", "{FCBC25C8-0BBF-4EA4-9043-743B06FFBC02}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FCBC25C8-0BBF-4EA4-9043-743B06FFBC02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCBC25C8-0BBF-4EA4-9043-743B06FFBC02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCBC25C8-0BBF-4EA4-9043-743B06FFBC02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCBC25C8-0BBF-4EA4-9043-743B06FFBC02}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {9D299831-D223-4240-9C3C-213A66157A87} + EndGlobalSection +EndGlobal diff --git a/ClientTest/App.config b/ClientTest/App.config new file mode 100644 index 0000000..731f6de --- /dev/null +++ b/ClientTest/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ClientTest/ClientTest.csproj b/ClientTest/ClientTest.csproj new file mode 100644 index 0000000..683a28a --- /dev/null +++ b/ClientTest/ClientTest.csproj @@ -0,0 +1,52 @@ + + + + + Debug + AnyCPU + {0AA862E1-2247-4CA7-8324-FBD7C5959CAF} + Exe + ClientTest + ClientTest + v4.6.1 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ClientTest/Program.cs b/ClientTest/Program.cs new file mode 100644 index 0000000..0aad98b --- /dev/null +++ b/ClientTest/Program.cs @@ -0,0 +1,82 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Text; + +public class SynchronousSocketClient +{ + + public static void StartClient() + { + // Data buffer for incoming data. + byte[] bytes = new byte[512]; + + // Connect to a remote device. + try + { + // Establish the remote endpoint for the socket. + // This example uses port 5000 on the local computer. + IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); + IPAddress ipAddress = IPAddress.Parse("192.168.0.109"); + IPEndPoint remoteEP = new IPEndPoint(ipAddress, 5000); + + // Create a TCP/IP socket. + Socket sender = new Socket(ipAddress.AddressFamily, + SocketType.Dgram, ProtocolType.Udp); + + // Connect the socket to the remote endpoint. Catch any errors. + try + { + //sender.Connect(remoteEP); + + //Console.WriteLine("Socket connected to {0}", + // sender.RemoteEndPoint.ToString()); + + // Encode the data string into a byte array. + byte[] msg = Encoding.ASCII.GetBytes("This is a test"); + + // Send the data through the socket. + int bytesSent = sender.SendTo(msg, remoteEP); + + // Creates an IPEndPoint to capture the identity of the sending host. + IPEndPoint sendingEndpoint = new IPEndPoint(IPAddress.Any, 0); + EndPoint senderRemote = (EndPoint)sendingEndpoint; + + // Receive the response from the remote device. + while(true) + { + int bytesRec = sender.ReceiveFrom(bytes, ref senderRemote); + Console.WriteLine("Echoed test = {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec)); + } + + // Release the socket. + sender.Shutdown(SocketShutdown.Both); + sender.Close(); + + } + catch (ArgumentNullException ane) + { + Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); + } + catch (SocketException se) + { + Console.WriteLine("SocketException : {0}", se.ToString()); + } + catch (Exception e) + { + Console.WriteLine("Unexpected exception : {0}", e.ToString()); + } + + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + + public static int Main(String[] args) + { + StartClient(); + return 0; + } +} diff --git a/ClientTest/Properties/AssemblyInfo.cs b/ClientTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..da929e3 --- /dev/null +++ b/ClientTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ClientTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ClientTest")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0aa862e1-2247-4ca7-8324-fbd7c5959caf")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")]