Merge pull request #42 from watashimeandeu/master

[.Net Core] fix unhandled exception when timeout reached, by unsubscribing correctly from socketEventArg.Completed event.
This commit is contained in:
Michele Cattafesta
2016-02-18 21:11:46 +01:00
2 changed files with 23 additions and 7 deletions

View File

@@ -243,8 +243,9 @@ namespace S7.Net
package.Add(Types.Word.ToByteArray((ushort) (count)));
package.Add(Types.Word.ToByteArray((ushort) (DB)));
package.Add((byte) dataType);
package.Add((byte) 0);
switch (dataType)
var overflow = (int)(startByteAdr * 8 / 0xffffU); // handles words with address bigger than 8191
package.Add((byte)overflow);
switch (dataType)
{
case DataType.Timer:
case DataType.Counter:
@@ -552,7 +553,8 @@ namespace S7.Net
package.Add(Types.Word.ToByteArray((ushort)varCount));
package.Add(Types.Word.ToByteArray((ushort)(db)));
package.Add((byte)dataType);
package.Add((byte)0);
var overflow = (int)(startByteAdr * 8 / 0xffffU); // handles words with address bigger than 8191
package.Add((byte)overflow);
package.Add(Types.Word.ToByteArray((ushort)(startByteAdr * 8)));
package.Add(new byte[] { 0, 4 });
package.Add(Types.Word.ToByteArray((ushort)(varCount * 8)));

View File

@@ -21,7 +21,7 @@ namespace S7.Net
socketEventArg.RemoteEndPoint = server;
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
var completedEvent = new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
@@ -35,11 +35,15 @@ namespace S7.Net
_clientDone.Set();
});
socketEventArg.Completed += completedEvent;
_clientDone.Reset();
_socket.ConnectAsync(socketEventArg);
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
socketEventArg.Completed -= completedEvent;
}
public void SetReceiveTimeout(int milis)
@@ -63,7 +67,7 @@ namespace S7.Net
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
socketEventArg.UserToken = null;
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
var completedEvent = new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
@@ -77,6 +81,8 @@ namespace S7.Net
_clientDone.Set();
});
socketEventArg.Completed += completedEvent;
socketEventArg.SetBuffer(buffer, 0, size);
_clientDone.Reset();
@@ -84,6 +90,8 @@ namespace S7.Net
_socket.SendAsync(socketEventArg);
_clientDone.WaitOne(_sendTimeout);
socketEventArg.Completed -= completedEvent;
}
else
{
@@ -104,7 +112,7 @@ namespace S7.Net
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
socketEventArg.SetBuffer(buffer, 0, size);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
var completedEvent = new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
@@ -118,11 +126,15 @@ namespace S7.Net
_clientDone.Set();
});
socketEventArg.Completed += completedEvent;
_clientDone.Reset();
_socket.ReceiveAsync(socketEventArg);
_clientDone.WaitOne(_receiveTimeout);
socketEventArg.Completed -= completedEvent;
}
else
{
@@ -139,6 +151,8 @@ namespace S7.Net
if (_socket != null)
{
_socket.Shutdown(SocketShutdown.Both);
_socket.Dispose();
_socket = null;
}
}
@@ -148,7 +162,7 @@ namespace S7.Net
private static ManualResetEvent _clientDone = new ManualResetEvent(false);
private const int TIMEOUT_MILLISECONDS = 5000;
private const int TIMEOUT_MILLISECONDS = 1000;
}
}