mirror of
https://github.com/fbarresi/Sharp7.git
synced 2026-02-04 08:42:51 +00:00
- removed comments and unused codes
This commit is contained in:
@@ -1,320 +1,10 @@
|
||||
/*=============================================================================|
|
||||
| PROJECT Sharp7 1.0.3 |
|
||||
|==============================================================================|
|
||||
| Copyright (C) 2016 Davide Nardella |
|
||||
| All rights reserved. |
|
||||
|==============================================================================|
|
||||
| Sharp7 is free software: you can redistribute it and/or modify |
|
||||
| it under the terms of the Lesser GNU General Public License as published by |
|
||||
| the Free Software Foundation, either version 3 of the License, or |
|
||||
| (at your option) any later version. |
|
||||
| |
|
||||
| It means that you can distribute your commercial software which includes |
|
||||
| Sharp7 without the requirement to distribute the source code of your |
|
||||
| application and without the requirement that your application be itself |
|
||||
| distributed under LGPL. |
|
||||
| |
|
||||
| Sharp7 is distributed in the hope that it will be useful, |
|
||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
| Lesser GNU General Public License for more details. |
|
||||
| |
|
||||
| You should have received a copy of the GNU General Public License and a |
|
||||
| copy of Lesser GNU General Public License along with Sharp7. |
|
||||
| If not, see http://www.gnu.org/licenses/ |
|
||||
|==============================================================================|
|
||||
History:
|
||||
* 1.0.0 2016/10/09 First Release
|
||||
* 1.0.1 2016/10/22 Added CoreCLR compatibility (CORE_CLR symbol must be
|
||||
defined in Build options).
|
||||
Thanks to Dirk-Jan Wassink.
|
||||
* 1.0.2 2016/11/13 Fixed a bug in CLR compatibility
|
||||
* 1.0.3 2017/01/25 Fixed a bug in S7.GetIntAt(). Thanks to lupal1
|
||||
Added S7Timer Read/Write. Thanks to Lukas Palkovic
|
||||
|
||||
*/
|
||||
using System;
|
||||
using System;
|
||||
using System.Threading;
|
||||
//------------------------------------------------------------------------------
|
||||
// If you are compiling for UWP verify that WINDOWS_UWP or NETFX_CORE are
|
||||
// defined into Project Properties->Build->Conditional compilation symbols
|
||||
//------------------------------------------------------------------------------
|
||||
#if WINDOWS_UWP || NETFX_CORE
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Networking;
|
||||
using Windows.Networking.Sockets;
|
||||
using Windows.Storage.Streams;
|
||||
#else // <-- Including MONO
|
||||
using System.Net.Sockets;
|
||||
#endif
|
||||
|
||||
namespace Sharp7
|
||||
{
|
||||
|
||||
#region [Async Sockets UWP(W10,IoT,Phone)/Windows 8/Windows 8 Phone]
|
||||
#if WINDOWS_UWP || NETFX_CORE
|
||||
class MsgSocket
|
||||
{
|
||||
private DataReader Reader = null;
|
||||
private DataWriter Writer = null;
|
||||
private StreamSocket TCPSocket;
|
||||
|
||||
private bool _Connected;
|
||||
|
||||
private int _ReadTimeout = 2000;
|
||||
private int _WriteTimeout = 2000;
|
||||
private int _ConnectTimeout = 1000;
|
||||
|
||||
public static int LastError = 0;
|
||||
|
||||
|
||||
private void CreateSocket()
|
||||
{
|
||||
TCPSocket = new StreamSocket();
|
||||
TCPSocket.Control.NoDelay = true;
|
||||
_Connected = false;
|
||||
}
|
||||
|
||||
public MsgSocket()
|
||||
{
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
if (Reader != null)
|
||||
{
|
||||
Reader.Dispose();
|
||||
Reader = null;
|
||||
}
|
||||
if (Writer != null)
|
||||
{
|
||||
Writer.Dispose();
|
||||
Writer = null;
|
||||
}
|
||||
if (TCPSocket != null)
|
||||
{
|
||||
TCPSocket.Dispose();
|
||||
TCPSocket = null;
|
||||
}
|
||||
_Connected = false;
|
||||
}
|
||||
|
||||
private async Task AsConnect(string Host, string port, CancellationTokenSource cts)
|
||||
{
|
||||
HostName ServerHost = new HostName(Host);
|
||||
try
|
||||
{
|
||||
await TCPSocket.ConnectAsync(ServerHost, port).AsTask(cts.Token);
|
||||
_Connected = true;
|
||||
}
|
||||
catch (TaskCanceledException)
|
||||
{
|
||||
LastError = S7Consts.errTCPConnectionTimeout;
|
||||
}
|
||||
catch
|
||||
{
|
||||
LastError = S7Consts.errTCPConnectionFailed; // Maybe unreachable peer
|
||||
}
|
||||
}
|
||||
|
||||
public int Connect(string Host, int Port)
|
||||
{
|
||||
LastError = 0;
|
||||
if (!Connected)
|
||||
{
|
||||
CreateSocket();
|
||||
CancellationTokenSource cts = new CancellationTokenSource();
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
cts.CancelAfter(_ConnectTimeout);
|
||||
Task.WaitAny(Task.Run(async () => await AsConnect(Host, Port.ToString(), cts)));
|
||||
}
|
||||
catch
|
||||
{
|
||||
LastError = S7Consts.errTCPConnectionFailed;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (cts != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
cts.Cancel();
|
||||
cts.Dispose();
|
||||
cts = null;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
}
|
||||
if (LastError == 0)
|
||||
{
|
||||
Reader = new DataReader(TCPSocket.InputStream);
|
||||
Reader.InputStreamOptions = InputStreamOptions.Partial;
|
||||
Writer = new DataWriter(TCPSocket.OutputStream);
|
||||
_Connected = true;
|
||||
}
|
||||
else
|
||||
Close();
|
||||
}
|
||||
return LastError;
|
||||
}
|
||||
|
||||
private async Task AsReadBuffer(byte[] Buffer, int Size, CancellationTokenSource cts)
|
||||
{
|
||||
try
|
||||
{
|
||||
await Reader.LoadAsync((uint)Size).AsTask(cts.Token);
|
||||
Reader.ReadBytes(Buffer);
|
||||
}
|
||||
catch
|
||||
{
|
||||
LastError = S7Consts.errTCPDataReceive;
|
||||
}
|
||||
}
|
||||
|
||||
public int Receive(byte[] Buffer, int Start, int Size)
|
||||
{
|
||||
byte[] InBuffer = new byte[Size];
|
||||
CancellationTokenSource cts = new CancellationTokenSource();
|
||||
LastError = 0;
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
cts.CancelAfter(_ReadTimeout);
|
||||
Task.WaitAny(Task.Run(async () => await AsReadBuffer(InBuffer, Size, cts)));
|
||||
}
|
||||
catch
|
||||
{
|
||||
LastError = S7Consts.errTCPDataReceive;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (cts != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
cts.Cancel();
|
||||
cts.Dispose();
|
||||
cts = null;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
if (LastError == 0)
|
||||
Array.Copy(InBuffer, 0, Buffer, Start, Size);
|
||||
else
|
||||
Close();
|
||||
return LastError;
|
||||
}
|
||||
|
||||
private async Task WriteBuffer(byte[] Buffer, CancellationTokenSource cts)
|
||||
{
|
||||
try
|
||||
{
|
||||
Writer.WriteBytes(Buffer);
|
||||
await Writer.StoreAsync().AsTask(cts.Token);
|
||||
}
|
||||
catch
|
||||
{
|
||||
LastError = S7Consts.errTCPDataSend;
|
||||
}
|
||||
}
|
||||
|
||||
public int Send(byte[] Buffer, int Size)
|
||||
{
|
||||
byte[] OutBuffer = new byte[Size];
|
||||
CancellationTokenSource cts = new CancellationTokenSource();
|
||||
Array.Copy(Buffer, 0, OutBuffer, 0, Size);
|
||||
LastError = 0;
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
cts.CancelAfter(_WriteTimeout);
|
||||
Task.WaitAny(Task.Run(async () => await WriteBuffer(OutBuffer, cts)));
|
||||
}
|
||||
catch
|
||||
{
|
||||
LastError = S7Consts.errTCPDataSend;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (cts != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
cts.Cancel();
|
||||
cts.Dispose();
|
||||
cts = null;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
if (LastError != 0)
|
||||
Close();
|
||||
return LastError;
|
||||
}
|
||||
|
||||
~MsgSocket()
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
public bool Connected
|
||||
{
|
||||
get
|
||||
{
|
||||
return (TCPSocket != null) && _Connected;
|
||||
}
|
||||
}
|
||||
|
||||
public int ReadTimeout
|
||||
{
|
||||
get
|
||||
{
|
||||
return _ReadTimeout;
|
||||
}
|
||||
set
|
||||
{
|
||||
_ReadTimeout = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int WriteTimeout
|
||||
{
|
||||
get
|
||||
{
|
||||
return _WriteTimeout;
|
||||
}
|
||||
set
|
||||
{
|
||||
_WriteTimeout = value;
|
||||
}
|
||||
}
|
||||
public int ConnectTimeout
|
||||
{
|
||||
get
|
||||
{
|
||||
return _ConnectTimeout;
|
||||
}
|
||||
set
|
||||
{
|
||||
_ConnectTimeout = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endregion
|
||||
|
||||
#region [Sync Sockets Win32/Win64 Desktop Application]
|
||||
#if !WINDOWS_UWP && !NETFX_CORE
|
||||
class MsgSocket
|
||||
{
|
||||
private Socket TCPSocket;
|
||||
@@ -356,15 +46,10 @@ namespace Sharp7
|
||||
try
|
||||
{
|
||||
|
||||
#if CORE_CLR
|
||||
var task = PingSocket.ConnectAsync(Host, Port);
|
||||
task.Wait(_ConnectTimeout);
|
||||
bool success = task.IsCompleted;
|
||||
#else
|
||||
IAsyncResult result = PingSocket.BeginConnect(Host, Port, null, null);
|
||||
bool success = result.AsyncWaitHandle.WaitOne(_ConnectTimeout, true);
|
||||
#endif
|
||||
if (!success)
|
||||
|
||||
if (!success)
|
||||
{
|
||||
LastError = S7Consts.errTCPConnectionFailed;
|
||||
}
|
||||
@@ -373,11 +58,7 @@ namespace Sharp7
|
||||
{
|
||||
LastError = S7Consts.errTCPConnectionFailed;
|
||||
};
|
||||
#if CORE_CLR
|
||||
PingSocket.Dispose();
|
||||
#else
|
||||
PingSocket.Close();
|
||||
#endif
|
||||
}
|
||||
|
||||
public int Connect(string Host, int Port)
|
||||
@@ -518,6 +199,4 @@ namespace Sharp7
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Sharp7
|
||||
|
||||
Reference in New Issue
Block a user